ggplot2中多个多重图

时间:2016-07-28 06:41:20

标签: r ggplot2

我最近发现了multiplot包中的Rmisc函数,可以使用ggplot2绘图/对象生成堆积图。我现在要做的是创建一个多重时隙。不幸的是,与ggplot函数不同,multiplot不会生成对象,因此只需嵌套multiplot就无法解决我的问题。

我将创建一个数据框,以明确我的观点。在名为df的数据框中,我有3列:periodgroupvalue。在10个时期内为3组中的每一组记录一定值。 (注意:尽管使用sample函数,我不使用下面的种子数,因为焦点不是数字,而是图形化的)

# Create a data frame for illustration purposes
df <- data.frame(period = rep(1:10, 3),
                 group = rep(LETTERS[1:3], each = 10),
                 value = sample(100, 30, replace = TRUE))

然后我将第四列添加到df,这是value列的指数转换。

df$exp.value = exp(df$value)

我想创建堆叠图,允许我将每组中的值与指数对应的值进行比较。

 # Split dataframe by group
 df_split <- split(df, df$group)

 # Plots of values in each group
 plots <- lapply(df_split, function(i){
   ggplot(data = i, aes(x = period, y = value)) + geom_line()
})

 # Plots of logged values in each group
 plots_exp <- lapply(df_split, function(i){
   ggplot(data = i, aes(x = period, y = exp.value)) + geom_line()
})

plotsplots_exp都是包含3个元素的列表,每个元素包含ggplot个对象。每个列表的第一个元素对应于组A,第二个元素对应于组B,第三个元素对应于组C.

为了将每个组的值与指数值进行比较,我可以使用multiplot函数。以下是A组的一个例子:

multiplot(plots[[1]], plots_log[[1]], cols = 1)

value_exp.value_grpA

如何创建一个网格,其中包含上面的多个图形以及B组和C组的多个图形?好像代码包含... + facet_grid(. ~ group)

1 个答案:

答案 0 :(得分:4)

我们可以使用 cowplot 包:

library(cowplot)
plot_grid(plots[[1]], plots_exp[[1]],
          plots[[2]], plots_exp[[2]],
          plots[[3]], plots_exp[[3]],
          labels = c("A", "A", "B", "B", "C", "C"),
          ncol = 1, align = "v")

enter image description here

我们可以通过 plots_exp 列表对象输出到pdf循环。每个页面将包含2个图。当我们有很多小组时,这是一个更好的选择:

pdf("myPlots.pdf")
lapply(seq(length(plots)), function(i){
  plot_grid(plots[[i]], plots_exp[[i]], ncol = 1, align = "v")
})
dev.off()

另一种选择是为 ggplot 准备数据并照常使用 facet

library(dplyr)
library(tidyr)
library(ggplot2)

gather(df, valueType, value, -c(group, period)) %>% 
  mutate(myGroup = paste(group, valueType)) %>% 
  ggplot(aes(period, value)) +
  geom_line() +
  facet_grid(myGroup ~ ., scales = "free_y")

enter image description here