我试图使用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
答案 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")
结果在这种微小的格式中有点局促,但我想怀疑的是更大的情节。