ggplot没有在循环中绘图

时间:2015-09-04 22:11:16

标签: r for-loop ggplot2

我试图使用ggplot绘制多个图表。我有一个包含216个变量的20个观测值的.xls。数据分为6个,因此有6个我感兴趣的大块。我使用另一个循环创建了这个数据,因此每个块除以3(12个变量的集合)。我想为6个块中的每一个绘制较小块的第一个变量。所以在我想要的情节中:my_data [,i],my_data [,i + 12],my_data [,i + 24],其中i从1:12变化(所以我= = 12 - > 12 + 24 = 36)。

time= 1:20   # definir #periodos
title = c("pib", "c", "i", "l", "pi", "r", "w", "cl", "cc", "wrel","lrel", "yrel") # for titles
title = rep(title, 3)
plot_list = list()
    for (i in 1:12) {  
        df = data.frame(time,    
            as.numeric(my_data[,i],as.numeric(my_data[,i+12]), 
                as.numeric(my_data[,i+24])))
        p = ggplot(df, aes(x = time, y= as.numeric(my_data[,i])))
            + geom_line()
            + geom_line(aes(y=as.numeric(my_data[,i]), colour="nr = 0.32"))
            + geom_line(aes(y=as.numeric(my_data[,i+12]), colour="nr = 0.4"))
            + geom_line(aes(y=as.numeric(my_data[,i+24]), colour="nr = 10"))
            + scale_colour_manual("", breaks=c("nr = 0.32", "nr = 0.4", "nr = 10"), 
            values = c("green", "royalblue4", "orangered"))
            + labs(x = "periodos", y = "vg4")
            + ggtitle(paste0(title[i], "_vg4 for diff.nr - tax"))
        plot_list[[i]] = p
        print(p)
}

当我这样做时,只打印第三个值(nr = 10)。有谁知道发生了什么?我已经尝试以不同的方式定义我的data.frame,但输出始终是相同的。 谢谢!!

数据和.r文件位于:https://www.dropbox.com/sh/efjtanbh5oznrg5/AADrhSUXOu3MYSCGLcFnNY_ea?dl=0

1 个答案:

答案 0 :(得分:4)

评论太长了。

首先,关于SO的约定是答案是为可重现的代码保留的,以演示解决方案。任何不足,如猜测或意见,都属于评论。由于您的代码根本不运行(没有my_data),除非您提供数据或我们为您创建样本,否则没有人可以回答您。正如您所料,大多数人都有理由不愿意做后者。

其次,这不是使用ggplot的好方法。我们的想法是使用aes(...)使用列名将图形的美学(例如,x和y轴,颜色等)映射到数据集的。所以,像这样:

    df = data.frame(time,    
                    y1 = as.numeric(my_data[,i]),
                    y2 = as.numeric(my_data[,i+12]), 
                    y3 = as.numeric(my_data[,i+24]))
    p = ggplot(df, aes(x = time)) +
        geom_line(aes(y=y1, colour="nr = 0.32")) +
        geom_line(aes(y=y2, colour="nr = 0.4")) +
        geom_line(aes(y=y3, colour="nr = 10")) + 
        ...

会更好 - 尽管仍然不是很好。

使用对geom_line(...)的三次调用创建三行也不是一个好主意。可能更好的方法是这样的:

library(reshape2)
df <- melt(data.frame(time,my_data[,i+c(0,12,24)]),
           id.vars="time", variable.name="nr", value.name="y")
p = ggplot(df, aes(x = time, y=y, color=nr)) +
    geom_line() +
    scale_colour_manual("", labels=c("nr = 0.32", "nr = 0.4", "nr = 10"), 
                            values = c("green", "royalblue4", "orangered"))+
    ...

这使用melt(...)包中的reshape2将数据从“宽”格式(不同列中不同行的数据)转换为“长”格式(所有y数据)单列,第二列(示例中为nr)区分不同的行。现在只有一个调用geom_line(...)

完全拉开这个:

## create artificial data set to demonstrate solution
set.seed(1)    # for reproducible example
my_data <- as.data.frame(matrix(rnorm(20*12*3), nrow=20))

library(reshape2)
library(ggplot2)
for (i in 1:12) {  
  df <- melt(data.frame(time,my_data[,i+c(0,12,24)]),id.vars="time", variable.name="nr", value.name="y")
  p = ggplot(df, aes(x = time, y=y, color=nr)) +
    geom_line() +
    scale_colour_manual("", labels=c("nr = 0.32", "nr = 0.4", "nr = 10"), 
                            values = c("green", "royalblue4", "orangered"))+
    labs(x = "periodos", y = "vg4")+
    ggtitle(paste0(title[i], "_vg4 for diff.nr - tax"))
  plot_list[[i]] = p
  print(p)
}

这产生了12个图,最后一个是:

最后,如果你想同时查看所有图,你可以melt(...)完整数据集(所有12 * 3 = 36列)并使用ggplot facets:

df <- melt(data.frame(time,my_data), id.vars="time", variable.name="nr", value.name="y")
df <- cbind(df,plot=rep(title,each=length(time)))
df$nr <- rep(c("A","B","C"),each=12*length(time))
ggplot(df, aes(x=time, y=y, color=nr))+
  geom_line()+
  facet_wrap(~plot, ncol=3)+
  scale_colour_manual("", labels=c("nr = 0.32", "nr = 0.4", "nr = 10"), 
                      values = c("green", "royalblue4", "orangered"))+
  labs(x = "periodos", y = "vg4", title="vg4 for diff.nr - tax")

enter image description here

结果在这种微小的格式中有点局促,但我想怀疑的是更大的情节。