我最近发现了multiplot
包中的Rmisc
函数,可以使用ggplot2
绘图/对象生成堆积图。我现在要做的是创建一个多重时隙。不幸的是,与ggplot
函数不同,multiplot
不会生成对象,因此只需嵌套multiplot
就无法解决我的问题。
我将创建一个数据框,以明确我的观点。在名为df
的数据框中,我有3列:period
,group
和value
。在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()
})
plots
和plots_exp
都是包含3个元素的列表,每个元素包含ggplot
个对象。每个列表的第一个元素对应于组A,第二个元素对应于组B,第三个元素对应于组C.
为了将每个组的值与指数值进行比较,我可以使用multiplot
函数。以下是A组的一个例子:
multiplot(plots[[1]], plots_log[[1]], cols = 1)
如何创建一个网格,其中包含上面的多个图形以及B组和C组的多个图形?好像代码包含... + facet_grid(. ~ group)
?
答案 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")
我们可以通过图和 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")