2015-10-15 31 views
3

我是facet_wrap的忠實粉絲。儘管分割一個大數據框並繪製幾張圖並在R內進行探索是快速的,但它並不總是在紙張或功率點上呈現的最佳工具。 我發現自己在縮放,binwidth和字體大小上浪費了大量時間,並最終修改了劇情。ggplot2:將單獨的facet_wrap構面保存爲獨立的構圖對象

有時候,我只是將我的數據框放入許多數據框中併爲每個數據框單獨繪圖。稍後加入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) 

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

回答

5

您可以使用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)) 
}) 

的複雜scale_colour_manual參數是一種方法,一種顏色的點標記,他們將如果是彩色的相同方式,所有的在ggplot的單個調用中包含cyl的值。

UPDATE:爲了解決您的意見,這個怎麼樣:

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

enter image description here

+0

是的,我找的那個。它完成了這項工作,但是語法很複雜,我們只是在做一個點圖。我發現這個https://github.com/guiastrennec/ggplus雖然它不適用於R版本3.2 –

+0

我設法繪製了我的具體情節,但它與x軸大量混亂(這是一個直方圖,而不是每個方面在計數中有相同的x值)對此有何建議? –

+0

我一直在使用和適應這個代碼:)。只是爲了給這個好的答案添加一些東西。如果x是某些級別的NA的因子,則使用scale_x_discrete(...,drop = FALSE)可解決每個圖中具有相同x級別的問題 –