ggplot2:将各个facet_wrap facet保存为单独的绘图对象

Mat*_*ina 6 plot r ggplot2

我是粉丝facet_wrap.虽然快速分割大数据框并绘制几个图并在R中进行探索,但它并不总是用于纸张或功率点的最佳工具.我发现自己在缩放比例,宽度和字体大小方面浪费了大量时间,并最终修改了情节.

有时我只是将我的数据框子集成到许多数据框中,并为每个数据框单独绘制.之后multiplot用手或手工加入.

我想知道是否有一种方法可以使ggplot调用几乎以相同的方式(一个大的df与一个用于分面的因子列)或一种方法来使ggplot从具有类似列表的数据帧的东西中读取因子.理想的输出应该是多个单个图,稍后我会在inkscape上编辑(并使用free_y刻度来减少痛苦)

要清楚,

df<-mtcars
ggplot(df,aes(df$mpg,df$disp,color=factor(cyl)))+
    geom_point(aes(df$mpg,df$disp))+
    facet_wrap( ~cyl)
Run Code Online (Sandbox Code Playgroud)

制作一个情节.在这种情况下,我想要的输出是三个图,每个面一个.

eip*_*i10 6

您可以使用lapply为每个值创建一个包含一个图表的列表cyl:

# Create a separate plot for each value of cyl, and store each plot in a list
p.list = lapply(sort(unique(mtcars$cyl)), function(i) {
  ggplot(mtcars[mtcars$cyl==i,], aes(mpg, disp, colour=factor(cyl))) +
    geom_point(show.legend=FALSE) +
    facet_wrap(~cyl) +
    scale_colour_manual(values=hcl(seq(15,365,length.out=4)[match(i, sort(unique(mtcars$cyl)))], 100, 65))
})
Run Code Online (Sandbox Code Playgroud)

复杂的scale_colour_manual参数是一种为点标记着色的方法,如果所有值cyl都包含在单个调用中,它们将被着色ggplot.

更新:要解决您的意见,这个怎么样:

# Fake data
set.seed(15)
dat = data.frame(group=rep(c("A","B","C"), each=100),
                 value=c(mapply(rnorm, 100, c(5,10,20), c(1,3,5))))

p.list = lapply(sort(unique(dat$group)), function(i) {
  ggplot(dat[dat$group==i,], aes(value, fill=group)) +
    geom_histogram(show.legend=FALSE, colour="grey20", binwidth=1) +
    facet_wrap(~group) +
    scale_fill_manual(values=hcl(seq(15,365,length.out=4)[match(i, sort(unique(dat$group)))], 100, 65)) +
    scale_x_continuous(limits=range(dat$value)) +
    theme_gray(base_size=15)
})
Run Code Online (Sandbox Code Playgroud)

结果如下.请注意,上面的代码在所有三个图表上给出了相同的x比例,但不是相同的y比例.要获得相同的y比例,您可以将其硬编码为, scale_y_continuous(limits = c(0,35))或者,您可以以编程方式为您设置的任何binwidth找到最大计数,然后将其提供给scale_y_continuous.

# Arrange all three plots together
library(gridExtra)
do.call(grid.arrange, c(p.list, nrow=3))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述