2016-07-28 75 views
1

我最近从Rmisc程序包中发现multiplot函数,以使用ggplot2绘图/对象生成堆积图。我现在想要做的是创建一个多槽的多槽。不幸的是,与ggplot函数不同,multiplot不生成对象,所以我的问题不能通过简单地嵌套multiplot来解决。ggplot2中的多槽图的多重绘图

我会创建一个数据框来清楚我的观点。在我的数据框df中,我有3列:period,groupvalue。对于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

如何创建的栅格,其中将包括上述的multiplot以及的那些用于组B和C?就好像代码包含... + facet_grid(. ~ group)

+1

为什么不绘制3行2列6个地块?另请参阅[cowplot软件包](https://cran.r-project.org/web/packages/cowplot/vignettes/introduction.html)了解多时隙。 – zx8754

回答

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

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

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

另一种选择是对ggplot准备数据,并使用像往常一样:

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