2017-05-15 25 views
0

主要目標是精細控制每個facet行的分面ggplot的y-scale。我的策略是爲每一行建立一個單獨的圖並將它們綁定在一起。替換具有多個數據集的現有ggplot的數據集

我想從現有的ggplot對象開始。要爲每個方面行構建一個圖,我計劃對原始數據進行子集化,並使用運算符%+%替換數據集。 但是,如果在不同層上有多個數據集,這似乎不可能。

是否有可能使用%+%替換多個/所有 ggplot中的數據集?

MWE以下:此方法適用於繪圖ga,其中第二個數據集dat2a不包含構面變量。但它不適用於第二個示例gb

library(ggplot2) 
dat1 <- data.frame(x=runif(9),y=runif(9), b=rep(1:3,3) ) 
dat2a <- data.frame(a=c(1,2),c=c(1,1)) 
dat2b <- data.frame(a=c(0.5,1,2),c=c(0.5,1,1),b=c(1,2,3)) 

ga <- ggplot(dat1, aes(x,y)) + 
    geom_point() + 
    facet_grid(b~.) + 
    geom_point(data=dat2a, aes(x=a, y=c), color='red') 
gb <- ggplot(dat1, aes(x,y)) + 
    geom_point() + 
    facet_grid(b~.) + 
    geom_point(data=dat2b, aes(x=a, y=c), color='red') 

# example a) working 
    ga 
    #Replot ga using the altered data frame 
    ga %+% dat1[dat1$b==2,] 
# example b) not working 
    gb 
    #Replot g using the altered data frame 
    gb %+% dat1[dat1$b==2,] 
+1

什麼是'dat'?你確定你打算在方括號中調用'dat',而不是'dat1',例如。 'gb%+%dat1 [dat1 $ b == 2,]'。 –

+0

確實'dat'應該是'dat1',很好的發現。我用修正編輯了代碼。 (還添加了庫ggplot2)。現在該示例應該正在運行。 – fber

回答

0

編輯:下面的解決方法可以實現所需的結果。但是,它也會修改原始ggplot對象的數據。不知何故,複製的ggplot對象仍然與原始鏈接。儘管解決方法回答了問題,但它並未解決問題。


在ggplot對象上使用str給了我一些提示。每個圖層都可以使用gb$layers進行訪問,每個圖層都有一個元素$data。這允許找出一層都有自己的data.frame:

lapply(gb_new2$layers, function(layer) is.data.frame(layer$data))

事實證明,更換這些data.frames會達到預期的效果。

(雖然我不知道是否有此更換不良後果,如錯誤軸縮放,或者有人可以確認,這種計算在後面的步驟調用ggplot_build()時,才執行?即是我們還在處理與對象gb是非常一樣的初始情節定義?)

以下各行提供ggplot對象gb的所需改變。

gb_new <- gb 
dat2b_extracted <- gb_new$layers[[2]]$data 
gb_new$layers[[2]]$data <- dat2b_extracted[dat2b_extracted$b==2,] 

gb_new %+% dat1[dat1$b==2,] 

這可以使用下面的自動化。雖然我不得不承認它仍然感覺非常黑客。

# copy ggplot object 
gb_new2 <- gb 

# edit copy of ggplot 
for (it in seq_along(gb_new2$layers)){ 
    # get data.frame of layer 
     temp_df <- gb_new2$layers[[it]]$data 
    # subset and replace it 
     if(is.data.frame(temp_df)) { gb_new2$layers[[it]]$data <- temp_df[temp_df$b==2,] } 
} 
# plot 
gb_new2 %+% dat1[dat1$b==2,] 
+0

我剛剛注意到這會導致我的預期用例出現一些錯誤。似乎複製ggplot對象不會複製底層數據。然後改變ggplot對象'gb_new2'的數據也會改變原始'gb'的數據。另見http://stackoverflow.com/questions/11431861/ggplot2-create-an-independent-copy-from-an-ggplot-object – fber

相關問題