for循环中的多个ggplots,总是相同的情节

时间:2017-05-12 11:40:28

标签: r for-loop plot ggplot2

所以我有一个数据帧tmp,每列都遵循不同的分布。我想要做的是在pdf中绘制直方图,每页都是直方图。但为什么我得到相同直方图的三倍?

当我输入g11时,我得到直方图g13,但是当我在pdf中绘制直方图时,而不是3个相同的页面(直方图1-3),我得到3个不同的页面,其上有相同的直方图。

可能是ggplot使用指针,并且由于第二个for循环,它会绘制g1i?

有没有办法重写我的代码? (这个例子简化了我的问题)

    tmp <- data.frame(x=rnorm(n=20, mean=0, sd=1),
                  y=rnorm(n=20, mean=10, sd=2),
                  z=rnorm(n=20, mean=40, sd=5))

for (i in 1:3){
  assign(paste("g1", i, sep=""),ggplot(tmp,aes(x=get(colnames(tmp)[i]))) + geom_histogram(binwidth=1))
}

pdf("/pathto/plot.pdf")
for(i in 1:3){
  #i <- 1
  grid.arrange(get(paste("g1", 1, sep="")), get(paste("g1", 2, sep="")), get(paste("g1", 3, sep="")))
}
dev.off()

2 个答案:

答案 0 :(得分:2)

我认为第一个for循环中的get没有正确更改列。 你可以试试这个:

for (i in 1:3){
    assign(paste("g1", i, sep=""),ggplot(tmp,aes_string(x=colnames(tmp)[i])) + geom_histogram(binwidth=1))
}

答案 1 :(得分:2)

我会像下面的代码一样重写它。 首先,我将数据从宽格式转换为长格式,然后对每个级别(x,y,z)进行子集化并绘制它。

library(ggplot2)
library(tidyr)

tmp <- data.frame(x=rnorm(n=20, mean=0, sd=1),
                  y=rnorm(n=20, mean=10, sd=2),
                  z=rnorm(n=20, mean=40, sd=5))

xy <- gather(tmp)

pdf("histogram.pdf")
for (i in unique(xy$key)) {
  x <- droplevels(xy[xy$key == i, ])
  print(
    ggplot(x, aes(x = value)) +
    theme_bw() +
    geom_histogram()
  )
}
dev.off()