2015-09-04 65 views
0

我想绘制使用ggplot的多个图。我有一个.xls,有20个216个变量的观察值。数据分为6个,所以我感兴趣的是6个大块。我使用另一个循环创建了这些数据,以便每个块被3除(12个变量组)。我想为6个块中的每一块绘制小块的第一个变量。所以在我想要的情节中:my_data [,i],my_data [,i + 12],my_data [,i + 24],其中我从1:12变化(这样i == 12 - > 12 + 24 = 36)。ggplot没有绘制在循环中

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

+2

帮助我们通过使您的代码具有可重现性(这意味着提供可用于您的代码的数据)来帮助您。一个问题是,你给ggplot数据帧'df',但是你在每次调用'aes'的时候引用一个单独的数据框('my_data')(并且你应该只引用列名;数据框应该被馈送到'ggplot'或'geom'的'data'参数)。你有没有检查绘图代码是否在循环之外工作? – eipi10

+0

只读取最后一个'geom_line()',因为它最后被调用并且正好在其他确切趋势之上运行。我怀疑列i,i + 12,i + 24保留了确切的值。检查重新排列几何线,看看是否只有最后一个会出现,这里是'nr = 10'。 – Parfait

回答

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方面:

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

结果是在这个小小的格式显得有些局促,但一个更大的阴谋将是美好的,我怀疑。

+0

你好jlhoward。感谢您的回复和建议。我一直有同样的问题。当我绘制所有图表时,我会看到红线。有没有办法让我把这个寄给你? (我的数据似乎与您创建的数据完全相同,即20个obs的36个变量)。 – rebeca

+0

我正在做的是:data_TAX < - read.xlsx(“D:/Users/E265297705/Documents/choques_antecipados_nr/Tax_nri.xls”,sheetIndex = 1,header = F,endRow = 20),然后是data_TAX < - as。 data.frame(dados_TAX)//和 my_data < - data_TAX [,1:36] – rebeca

+0

您可以上传'xls'文件的某处(Dropbox?)并发布链接(在问题中,而不是在评论中)。 – jlhoward