【问题标题】:Strange issue with ggplot inside a for-loopggplot 在 for 循环中的奇怪问题
【发布时间】: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 我明白了!谢谢,现在可以使用了。

标签: r for-loop ggplot2


【解决方案1】:

按照 cmets 中的建议。问题已解决如下:

for (i in colnames(TS)[2:6]) {
assign(paste0("p",i),ggplot(TS, aes_string(x="Timestamp", y=i)) +
       geom_line() +
       scale_x_datetime(breaks = date_breaks("5 day")) +
       theme_few())
}

p<-arrangeGrob(pT1,pT2,pT3,pT4,pT5,pT6)
ggsave("~/Desktop//TS.png",p)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-25
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    相关资源
    最近更新 更多