如何在 R 中使用带有 ggpie 函数的循环并在数据帧之后保存文件名?

Posted

技术标签:

【中文标题】如何在 R 中使用带有 ggpie 函数的循环并在数据帧之后保存文件名?【英文标题】:How do you use loop in R with ggpie function and save a filename after the dataframe? 【发布时间】:2022-01-16 10:23:45 【问题描述】:

我已经严重依赖其他几个 SO 帖子,但似乎无法超越这个。 以下是我使用过的参考资料:

Loop with a defined ggplot function over multiple dataframes

Loop in R to create and save series of ggplot2 plots with specified names

我的目标是使用循环从数据框列表中保存每个饼图:“Sample_List”(这将更长)。我一直收到这个错误,很困惑:

"Error: Aesthetics must be either length 1 or the same as the data (1): fill, y"

数据:

DZmix_SC1:

# A tibble: 3 × 4
  Sample_ID Potential_Sources Relative_Contribution Metric
  <chr>     <chr>                             <dbl> <chr> 
1 SC1_18    Uintas                                0 KV    
2 SC1_18    Sierra Madre                         22 KV    
3 SC1_18    CMB                                  78 KV 

DZmix_5_SC:

# A tibble: 3 × 4
  Sample_ID Potential_Sources Relative_Contribution Metric
  <chr>     <chr>                             <dbl> <chr> 
1 5-SC_18   Uintas                                0 KV    
2 5-SC_18   Sierra Madre                         29 KV    
3 5-SC_18   CMB                                  71 KV 

DZmix_PL3:

# A tibble: 3 × 4
  Sample_ID Potential_Sources Relative_Contribution Metric
  <chr>     <chr>                             <dbl> <chr> 
1 PL3_18    Uintas                               69 KV    
2 PL3_18    Sierra Madre                          0 KV    
3 PL3_18    CMB                                  31 KV   

这是我目前所拥有的:

Sample_list <- c("DZmix_SC1", "DZmix_5_SC", "DZmix_PL3")

DZpie.fn <- function(df,title) 
  df <- df  %>% 
  mutate(Relative_Contribution = round(Relative_Contribution,1)) %>%
  arrange(desc(Potential_Sources))
ggpie(df,"Relative_Contribution", label = "Relative_Contribution",
      fill = "Potential_Sources", color = "white", size = 1.5,
      palette = c("#636363", "#cccccc", "#969696")) +
      lab.pos = c("in"),
      lab.font = c(0, "bold", "black")) +
  theme(legend.position = "none", 
        panel.background = element_rect(fill = "transparent"), 
        plot.background = element_rect(fill = "transparent", color = NA)) 
 #end DZpie.fn

for(i in Sample_list)
  print(DZpie.fn(get(i), i)) 


最终我想用一个有效的 ggsave 函数替换循环中的打印函数......这是我的努力:

ggsave(DZpie.fn, filename=paste("/outputpath/",i,".png",sep=""))

提前感谢您的帮助!

【问题讨论】:

这个错误与ggpie的fill参数有关。尝试将其更改为fill = Potential_Sources。或者像c('red', 'blue', 'yellow')这样的向量,根据您的数据具有有效长度 请分享示例数据,以便其他人可以重现您的错误。在此处查看更多信息How to make a great R reproducible example? @Tung 我很抱歉,绝对是疏忽。我试图返回并添加代表性数据。出于某种原因,尽管在我编辑时它们看起来很好,但保存后表格的格式并不干净。因此,我也包含了表格信息的屏幕截图。 @englealuze 我尝试了这两个建议并第一次得到了这个:“as.vector(x) 中的错误:找不到对象'Relative_Contribution'”和这个:“错误:美学必须是长度 1或与数据(1)相同:y”用vector方法。 您的数据中的标头是Contribution 而不是Relative_Contribution,这就是找不到它的原因。 Sources 也一样。试试像ggpie(df, Contribution, label = "Relative_Contribution", fill = Contribution)这样简单的东西 【参考方案1】:

这对我有用

library(tibble)
library(dplyr)
library(ggpubr)

DZmix_SC1 <- tibble(
  Sample_ID = rep('SC1_18', 3), 
  Potential_Sources = c('Uintas', 'Sierra Madre', 'CMB'), 
  Relative_Contribution = c(0,22,78),
  Metric = rep('KV', 3)
)

DZmix_5_SC <- tibble(
  Sample_ID = rep('5-SC_18', 3), 
  Potential_Sources = c('Uintas', 'Sierra Madre', 'CMB'), 
  Relative_Contribution = c(0,29,71),
  Metric = rep('KV', 3)
)

DZmix_PL3 <- tibble(
  Sample_ID = rep('PL3_18', 3), 
  Potential_Sources = c('Uintas', 'Sierra Madre', 'CMB'), 
  Relative_Contribution = c(69,0,31),
  Metric = rep('KV', 3)
)

Sample_list <- c("DZmix_SC1", "DZmix_5_SC", "DZmix_PL3")

DZpie.fn <- function(df,title) 
  df <- df  %>% 
    mutate(Relative_Contribution = round(Relative_Contribution,1)) %>%
    arrange(desc(Potential_Sources))
  ggpie(df, "Relative_Contribution", label = "Relative_Contribution",
        fill = "Potential_Sources", color = "white", size = 1.5,
        palette = c("#636363", "#cccccc", "#969696"),
        lab.pos = c("in"),
        lab.font = c(0, "bold", "black")) +
  theme(legend.position = "none", 
        panel.background = element_rect(fill = "transparent"), 
        plot.background = element_rect(fill = "transparent", color = NA)) 
 

for(i in Sample_list)
  print(DZpie.fn(get(i), i)) 

您的方法实际上是正确的。您只是错过了在lab.pos = c("in") 之前放置的+

然后您可以使用保存图像

for (i in Sample_list)
  ggsave(DZpie.fn(get(i), i), filename=paste0("temp/",i,".png"))

或者等价但没有for循环

purrr::walk(Sample_list, function(name) ggsave(DZpie.fn(get(name), name), 
                                               filename=paste0("temp/",name,".png")))

【讨论】:

以上是关于如何在 R 中使用带有 ggpie 函数的循环并在数据帧之后保存文件名?的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中使用“foreach()”函数时如何创建进度条?

在 R 中使用带有多个参数的匿名函数

使用 Rcpp 在 C++ 函数的 R 中使用 for 循环的内存问题

如何从函数游标返回行并在oracle中循环

如何在带有嵌套字典的嵌套循环中正确使用字典“.update”函数[重复]

如何在“R”中的foreach循环中导出多个函数或包