创造&用循环存储因子A和B的ggplots(x,y)

时间:2016-12-05 19:39:30

标签: r loops dataframe ggplot2 conditional-statements

我爱R但不幸的是我还有更多要学习的东西我绝对想要。

数据:

Classes 'grouped_df', 'tbl_df', 'tbl' and 'data.frame': 3550 obs. of  18   variables:
$ SAMPLE.ID  : Factor w/ 150 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
$ COMMUNITY  : chr  "com.1" "com.1" "com.1" "com.1" ...
$ NUTRIENT   : Factor w/ 25 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
$ RATIO      : Factor w/ 23 levels "3.2","4","5.4",..: 11 9 6 4 1 14 10 8 5 2 ...
$ PHOS       : Factor w/ 5 levels "0.09","0.195",..: 5 5 5 5 5 4 4 4 4 4 ...
$ NIT        : Factor w/ 5 levels "1.5482","3.0964",..: 5 4 3 2 1 5 4 3 2 1 ...
$ DATUM      : Factor w/ 35 levels "30.08.16","31.08.16",..: 1 1 1 1 1 1 1 1 1 1 ...
$ DAY        : int  0 0 0 0 0 0 0 0 0 0 ...
$ TYPE       : chr  "mono" "mono" "mono" "mono" ...
$ ALGAE      : Factor w/ 6 levels "ANK","CHLA","MIX A",..: 5 5 5 5 5 5 5 5 5 5 ...
$ MEAN       : num  864 868 882 873 872 ...
$ GROW       : num  0.00116 0.00115 0.00113 0.00115 0.00115 ...
$ FLUORO     : num  NA NA NA NA NA NA NA NA NA NA ...
$ MEAN.MQ    : num  0.964 0.969 0.985 0.975 0.973 ...
$ GROW.MQ    : num  1.04 1.03 1.02 1.03 1.03 ...
$ carbon     : num  -764 -913 -1394 -1085 -1039 ...
$ carbon.unit: chr  "mikro g per litre" "mikro g per litre" "mikro g per litre" "mikro g per litre" ...
$ growthrate : num  NA NA NA NA NA NA NA NA NA NA ...

我在寻找:

我已经创建了大量其他情节,但每次我为每个情节编写相同的代码,然后我必须手动编辑,我真的需要努力工作/结果平衡。

我想用

生成一个ggplot

X轴为DAY,Y轴为增长率

我需要为ALGAE&的所有组合生成这样的图表。营养成分。

由于这是很多情节,如果标题会调整会很有帮助。我还想将它们存储在一个列表中,比如这个

plot_list <- list() 

我知道ggplot代码应该包含aes_string而不是aes但是我现在已经看了很多问题而且我不能,因为我的生活,想出这个。

帮助会导致严重的缓解,感激甚至心跳跳动

3 个答案:

答案 0 :(得分:1)

请尝试在将来包含可重现的数据。有关更多示例,请参阅here。对于此答案,我将使用diamonds

附带的ggplot2数据集

最简单的方法是使用facet_grid,这是出于此目的:

ggplot(diamonds
       , aes (x = carat
              , y = price)) +
  geom_smooth() +
  facet_grid(clarity~color)

为每对清晰度/颜色(如您的中间因素)提供一个面板。

enter image description here

如果由于某种原因必须将这些作为单独的图表,那么这样的嵌套lapply应该有效。它设置了两个因子级别中的每一个,然后将数据过滤到只匹配的那些行。 (do将它们全部放回一个列表中,而不是列表列表中。请注意,这是使用dplyr进行过滤步骤(以及加载管道)。

allPairs <-
  lapply(levels(diamonds$clarity), function(thisClarity){
    lapply(levels(diamonds$color), function(thisColor){
      diamonds %>%
        filter(clarity == thisClarity
               , color == thisColor) %>%
        ggplot(aes(x = carat
                   , y = price)) +
        geom_smooth() +
        ggtitle(paste0("Clarity: ", thisClarity
                       , "\nColor: ", thisColor))
    })
  }) %>%
  do.call(c, .)

然后,您可以处理该图表列表,但是您当前正在处理它们。

答案 1 :(得分:0)

这应该可以解决问题:

plot_list <- list()

for(i in levels(data$ALGAE)) { for(j in levels(data$NUTRIENT)) { dat = data[data$ALGAE == i & data$NUTRIENT == j,] plt <- ggplot(data = dat, aes(x = DAY, y = GROW)) + geom_point() plot_list[[paste(i, j, sep = "_")]] = plt } }

祝你好运!

答案 2 :(得分:0)

我个人喜欢使用plyr / dplyr,它比for循环更紧凑,比lapply更可读,

p <- ggplot(diamonds, aes(x = carat, y = price)) +  geom_smooth()
allPairs2 <- plyr::dlply(diamonds, .(clarity, color), "%+%", e1=p)
grid.arrange(grobs = allPairs2)

enter image description here

我使用%+%作为快捷方式(它会覆盖&#34;模板&#34; plot p)的数据,但明确定义绘图的匿名函数可能更具可读性,< / p>

allPairs2 <- plyr::dlply(diamonds, .(clarity, color), 
                function(d) {ggplot(d, aes(x = carat, y = price)) +  geom_smooth()})