簡體   English   中英

ggplot2:將單個 facet_wrap facet 保存為單獨的繪圖對象

[英]ggplot2: Save individual facet_wrap facets as separate plot objects

我是facet_wrap忠實粉絲。 盡管在 R 中拆分大數據框並繪制多個圖並進行探索速度很快,但它並不總是以紙張或幻燈片形式呈現的最佳工具。 我發現自己在比例、binwidths 和字體大小上浪費了很多時間,並最終在inkscape 上修改了繪圖。

有時我只是將我的數據框子集到許多數據框並為每個數據框單獨繪制。 稍后通過multiplot或手動加入它們。

我想知道是否有一種方法可以幾乎以相同的方式進行 ggplot 調用(一個帶有用於分面的因子列的大 df),或者有一種方法可以讓 ggplot 從具有由我的分面分隔的類似列表的數據框的內容中讀取因素。 理想的輸出應該是多個單圖,我稍后會在inkscape上進行編輯(並使用free_y scales來減少痛苦)

要清楚,

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

產生一個情節。 在這種情況下,我想要的輸出是三個圖,每個面一個。

您可以使用lapplycyl每個值創建一個帶有一個圖的列表:

# 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))
})

如果cyl所有值都包含在對ggplot的單個調用中, ggplot復雜的scale_colour_manual參數是一種為點標記着色的方法。

更新:為了解決您的評論,如何:

# 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)
})

結果如下。 請注意,上面的代碼在所有三個圖形上為您提供相同的 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))

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM