在一个ggplot()内生成多个ggplot数字

时间:2015-05-18 20:20:13

标签: r ggplot2

我想使用相同的ggplot代码生成8个不同的数字,条件是我的数据帧中的数字。通常我会使用facet_grid,但在这种情况下,我想最终得到每个人的数字的pdf。例如,我想在这里每行一个pdf:

df <- read.table(text = "
xvalue     yvalue    location    planting    crop
  1          5          A          early      corn
  2          3          A          late       corn
  6          2          A          early      soy
  7          4          A          late       soy
  4          7          S          early      corn
  2          6          S          late       corn
  3          2          S          early      soy
  5          1          S          late       soy
", sep = "", header = TRUE)

基本ggplot:

library(ggplot2)

ggplot()+
  geom_point(aes(x=xvalue, y=yvalue), data=df)

但不是facet_grid来获取位置x种植x作物组合,我想要一个单独的pdf。

3 个答案:

答案 0 :(得分:1)

首先我将你的MWE变成data.table,因为它更快

library(data.table)
library(ggplot2)
library(gridExtra)

df <- data.table(read.table(text = "
            xvalue     yvalue    location    planting    crop
            1          5          A          early      corn
            2          3          A          late       corn
            6          2          A          early      soy
            7          4          A          late       soy
            4          7          S          early      corn
            2          6          S          late       corn
            3          2          S          early      soy
            5          1          S          late       soy
            ", sep = "", header = TRUE))

我将您的plantingcorn信息粘贴在一起以创建单独的列:

df[ , plantingCrop := paste(df$planting, df$crop, sep = "-") ]

我创建了一个包含plantingcrop所有组合的字符向量。你会在一秒钟内看到原因:

plantingCrop1 <- unique(df$plantingCrop)

我使用gridExtra在单独的.pdf页面中创建所有图表。我基本上创建了一个循环,绘制了与上面plantingCrop1对象中的字符一样多的图形。在每个循环中,dat是您要将plantingCropplanting列粘贴在一起的唯一crop组要绘制的子集化组。它重复这一切,直到一切都完成。

pdf("plantingCrop.pdf", onefile = TRUE)
for(i in 1:length(plantingCrop1)){
        dat <- subset(df, plantingCrop==plantingCrop1[i])
        cropPlot <- ggplot(dat, aes(xvalue,yvalue)) + 
                    geom_boxplot(aes(color = location)) + 
                    theme_bw() + 
                    ggtitle(bquote(atop(.("Boxplot of Stuff"), 
                          atop(italic(.(plantingCrop1[i])), "")))) +
                    labs(x = "xvalue", y = "yvalue") +
                    theme(legend.position = "top", legend.title=element_blank())
        grid.arrange(cropPlot)
        }
dev.off()

我还提供了使用plantingCrop名称作为副标题命名文件的正确方法。那是在ggtitle电话中。

我建议您在有更多数据的情况下将geom_boxplot(aes(color = location))更改为geom_boxplot(aes(fill = location),因为它更好地显示在图表上,但我现在就这样离开,这样您就可以看到不同的群组

答案 1 :(得分:0)

这是另一种方法:

library(plyr)
library(ggplot2)

df <- read.table(text = "
xvalue     yvalue    location    planting    crop
  1          5          A          early      corn
  2          3          A          late       corn
  6          2          A          early      soy
  7          4          A          late       soy
  4          7          S          early      corn
  2          6          S          late       corn
  3          2          S          early      soy
  5          1          S          late       soy
", sep = "", header = TRUE)

fplot <- function(d)
  {
     require(ggplot2)
     p <- ggplot(d, aes(x = xvalue, y = yvalue)) +
             geom_point(size = 4) +
             xlim(0, 10) + ylim(0, 10)
     file <- with(d, paste0(paste(planting, crop, location, sep = "_"), ".pdf"))
     ggsave(file, p)
  }

d_ply(df, ~ rownames(df), fplot)

文件名看起来像early_corn_A.pdf,并保存在当前的工作目录中。为了方便起见,我设置了固定的x / y限制。该功能需要 一行数据框作为输入并输出pdf格式的图。 plyr::d_ply()函数处理数据框的每一行,并为每行生成一个单独的图。

答案 2 :(得分:0)

我遇到了类似的问题。

我只是用

  

gridExtra()

可用here

然后,我使用了另一个名为:

的包
  

cowplot()

可用here

然后我按照here步骤进行了操作。

它就像一个魅力。 :d

希望它有所帮助。