一个或多个循环 - 多个ggplot图r

时间:2016-06-24 21:16:03

标签: r for-loop ggplot2

前几天我确实问了一些关于循环的问题,这对我很有帮助,非常感谢你们!我想,这次我遇到了更复杂的问题。 我在剧情代码中跳过了标签和一些细节,但它完美无缺。

一般来说,我想用循环制作大量的情节。我学会了如何处理像this这样的简单情节,但是对于ggplot和aes,我发现它更复杂。

Here are the data为dropbox上的.csv。

一些准备工作:

data <- select(baza,strefa,v1,v2,v3,v4,v5,v6,v7,v8) # with dplyr package
strefa <- data$strefa
data$strefa <- NULL
data <- data.frame(apply(data, 2, function(x) {x <- recode(x, "9=NA"); x})) #with car package

一些总结为aes:     a&lt; - data $ v1     df&lt; - data.frame(cbind(a,strefa))

srednie <- aggregate(a ~ strefa, data = df, FUN = mean)
GD.mean <- round(mean(a, na.rm = TRUE), digits = 2)
srednie <- rbind(srednie, c(13,GD.mean))

和ggplot代码:

 jpeg(paste0("plot_",names(data)[i],".jpg"),
         width = 166, height = 120, units = "mm", pointsize = 12,
         res = 300, quality = 90)
     ggplot(srednie, aes(x=factor(strefa), y=a, label=round(srednie$a, digits = 2))) +
          geom_bar(position=position_dodge(), stat="identity", fill="#fff68f", colour="darkgrey", width = 0.5) +
          theme(axis.text.x = element_blank(), axis.ticks.x = element_blank(), axis.ticks.y = element_blank()) +
          geom_text(size = 4, hjust = 1.2) +
          coord_flip(ylim = c(1,6))              
     dev.off()

如何将其绑定到for循环中?它应该是一个循环还是更多?

for (i in 1:length(names(data))) {

    df <- data.frame(cbind(i,strefa))
    srednie <- aggregate(i ~ strefa, data = df, FUN = mean)
    GD.mean <- round(mean(i, na.rm = TRUE), digits = 2)
    srednie <- rbind(srednie, c(13,GD.mean))

jpeg(paste0("plot_",names(data)[i],".jpg"),
                 width = 166, height = 120, units = "mm", pointsize = 12,
                 res = 300, quality = 90)
      ggplot(srednie, aes(x=factor(strefa), y=i, label=round(srednie$i, digits = 2))) +
            geom_bar(position=position_dodge(), stat="identity", fill="#fff68f", colour="darkgrey", width = 0.5) +
            theme(axis.text.x = element_blank(), axis.ticks.x = element_blank(), axis.ticks.y = element_blank()) +
            geom_text(size = 4, hjust = 1.2) +
            coord_flip(ylim = c(1,6))

 dev.off()
    }

1 个答案:

答案 0 :(得分:1)

由于您的代码似乎按预期工作,因此您确实没有问题。这只是对其他尝试方法的建议。

如果您要使用dplyr,请继续使用。在R中有许多不同的循环方法。我个人倾向于远离for循环并使用apply(applylapply', sapply&#39;)函数或{{ 1}}。

我没有投递箱帐户而且不打算制作一个帐户,因此我无法使用您的数据。但是,这是一个你应该能够适应的例子。

<强>包装:

dplyr

数据生成:随机数据,我只想制作一些简单的条形图。

library(ggplot2)
library(dplyr)
library(tidyr)

绘图&#39;循环&#39;

首先,为剧情创建一个函数:

Data <- data.frame(Groups=LETTERS[1:5],
                   Var1 = rchisq(5,1),
                   Var2 = rchisq(5,1),
                   Var3 = rchisq(5,1))

这是绘图的主力。请注意使用plt.fnc <- function(frm){ PLT <- ggplot(frm,aes(x=Groups,y=Value)) + geom_bar(stat='identity') + xlab(frm$Variable[1]) ggsave(PLT,file=paste0('PLOT_',frm$Variable[1],'.jpeg'),width=10,height=7.5) return(PLT) } 而不是ggsave / jpeg。功能是相同的,但ggsave往往使代码更清洁。 此功能既可以生成绘图并保存它。当你的代码开始变得混乱时,将循环的内容放入函数可能是一个很好的做法,因为它可以让你保持更清洁的流程。

接下来,我使用dplyr而不是使用循环。

dev.off

此方法的主要问题是您必须弄清楚如何将绘图中所需的所有信息合并到一个数据帧中。如果无法做到这一点,那么通常应用函数或Plots <- Data %>% gather(Variable,Value,Var1:Var3) %>% # this is equivilent to melt. group_by(Variable) %>% # itterates over values of variable do(Plot = plt.fnc(.)) # Calls our plotting function. 循环会更好。