【发布时间】:2015-02-03 13:08:39
【问题描述】:
我正在尝试在 for 循环中使用 ggplot 绘制几个图形(名为 p1、p2、p3、p4、p5、p6):
for(i in 1:6){
assign(paste0("p",i), ggplot(TS, aes(Timestamp,TS[,i+1])) +
geom_line() +
scale_x_datetime(breaks = date_breaks("5 day")) +
theme_few())
}
p<-arrangeGrob(p1,p2,p3,p4,p5,p6)
ggsave("~/Desktop/TS.png",p)
但是,所有图表都与上一张相同。即,p1 = p2 = p3 = p4 = p5 = p6!这是不可能的,因为用于绘制它们的变量值非常不同。这很奇怪,我不知道我做错了什么。当我不使用 for 循环并将绘图手动存储在 p1,...p6 中时,即
assign(paste0("p",1), ggplot(TS, aes(Timestamp,TS[,2])) +
geom_line() +
scale_x_datetime(breaks = date_breaks("5 day")) +
theme_few())
.
.
.
assign(paste0("p",6), ggplot(TS, aes(Timestamp,TS[,7])) +
geom_line() +
scale_x_datetime(breaks = date_breaks("5 day")) +
theme_few())
一切都很好。
我也试过了
p <- list()
for(i in 1:6){
p[[i]] <- ggplot(TS, aes(Timestamp,TS[,i+1])) +
geom_line() +
scale_x_datetime(breaks = date_breaks("5 day")) +
theme_few()
}
do.call(grid.arrange,p)
但同样的问题发生了。
我发现另一个线程(此处:ggplot does not work if it is inside a for loop although it works outside of it)似乎有类似的问题,但使用“打印”解决了该问题。在我的例子中,我将每个图分配给相应的“p”i,所以它应该也可以工作。
【问题讨论】:
-
使用列名而不是索引。或者改用
lapply。 -
如何使用列名?它们应该在 for 循环内改变。
-
for (i in colnames(TS)[2:7])...aes_string(x="Timestamp", y=i)... -
我不认为arrangeGrob 的输出是一个ggplot 对象。不过,您可以使用
pdf(filename.pdf); arrangeGrob(p1,p2,...etc); dev.off保存。 -
@shadow 我明白了!谢谢,现在可以使用了。