2016-03-01 123 views
6

有沒有辦法改變facet_gridfacet_wrap中各個facet的y軸的高度/長度?在ggplot2中調整facet-grid/facet_wrap中面板的相對空間

例如,

library(ggplot2) 
ggplot(economics_long[economics_long$variable %in% c("pop", "uempmed"),], aes(date, value)) + 
    geom_line() + 
    facet_grid(variable~., scales = "free_y") + 
    theme(strip.background = element_blank()) 

enter image description here

在上述圖中,我想在彈出時間序列y軸高度/長度爲,比如說,兩倍大的uempmed Y-而不管兩個時間序列具有不同的y軸比例。

像什麼Kohske在這裏所做的,在一個更舊版本的GGPLOT2,這不ggplot工作> = 2.0.0:

https://kohske.wordpress.com/2010/12/25/adjusting-the-relative-space-of-a-facet-grid/

我知道我可以在facet_grid指定參數space = "free" ,但我不認爲這個論據可以用來設定2:1的Y軸比率?

我也不想使用「grid.arrange類型」解決方案來排列單獨創建的ggplots(我可以使用不同的y軸長度的2個獨立的圖),因爲我理想地希望使在這個單一的facet_wrap情節中使用Shiny的交互式ggplot2功能(例如,使用畫筆的交互式閃亮小平面示例在這裏是頁面的一半:http://shiny.rstudio.com/articles/selecting-rows-of-data.html)。

+1

你有沒有發現你的問題的解決方案?我問,因爲我有完全相同的問題。當你有3個網格並且你希望它們的比例(2,1,1)時該怎麼辦。使用grid_extra和高度參數很容易,但是它們不能很好地垂直對齊 – Franky

+0

不幸的是還沒有。也許有辦法,特別是在過去一年左右ggplot2的更新,但我不知道它。 我的猜測是,它可能仍然需要在ggplot2源代碼中實現,我對此並不十分熟悉。 – FXQuantTrader

回答

1

有多種選擇。

對於facets,可以使用facet_grid(..., space='free_y')將每行的高度調整爲y尺度的長度。然而,在您的數據集中,最下面一行最小化爲一行(0-25比200,000 - 320,000)。

當繪製/打印ggplot2對象時,首先將它們轉換爲gtable對象。將你的繪圖保存爲p,我們可以調用ggplotGrob來獲取gtable對象。這是一個單向程序;一旦轉換,你不能將gtable轉換回ggplot2對象!

(g <- ggplotGrob(p)) 
TableGrob (12 x 8) "layout": 18 grobs 
    z   cells  name         grob 
1 0 (1-12, 1- 8) background  rect[plot.background..rect.3766] 
2 1 (6- 6, 4- 4) panel-1-1    gTree[panel-1.gTree.3696] 
3 1 (8- 8, 4- 4) panel-1-2    gTree[panel-2.gTree.3711] 
4 3 (5- 5, 4- 4) axis-t-1       zeroGrob[NULL] 
5 3 (9- 9, 4- 4) axis-b-1 absoluteGrob[GRID.absoluteGrob.3725] 
6 3 (6- 6, 3- 3) axis-l-1 absoluteGrob[GRID.absoluteGrob.3733] 
7 3 (8- 8, 3- 3) axis-l-2 absoluteGrob[GRID.absoluteGrob.3741] 
8 3 (6- 6, 6- 6) axis-r-1       zeroGrob[NULL] 
9 3 (8- 8, 6- 6) axis-r-2       zeroGrob[NULL] 
10 2 (6- 6, 5- 5) strip-r-1       gtable[strip] 
11 2 (8- 8, 5- 5) strip-r-2       gtable[strip] 
12 4 (4- 4, 4- 4)  xlab-t       zeroGrob[NULL] 
13 5 (10-10, 4- 4)  xlab-b titleGrob[axis.title.x..titleGrob.3714] 
14 6 (6- 8, 2- 2)  ylab-l titleGrob[axis.title.y..titleGrob.3717] 
15 7 (6- 8, 7- 7)  ylab-r       zeroGrob[NULL] 
16 8 (3- 3, 4- 4) subtitle zeroGrob[plot.subtitle..zeroGrob.3763] 
17 9 (2- 2, 4- 4)  title  zeroGrob[plot.title..zeroGrob.3762] 
18 10 (11-11, 4- 4) caption zeroGrob[plot.caption..zeroGrob.3764] 

所有元素都設置爲網格狀佈局。每行的佈局的高度由g$heights給出:中

> g$heights 
[1] 5pt     0cm     0cm     0cm     0cm     1null    5pt     1null    0.396281911581569cm 1grobheight   
[11] 0cm     5pt  

匹配座標「面板-1-1」和「面板-1-2」到這個高度,你會發現第6和第8個元素都是1null。您可以將它們更改爲任何單位,cm,in,pt,... 1null就是其他元素之後剩下的東西,並將它們分開。因此,我們可以改變6 heigth到2null(注意使用雙括號):

> g$heights[[6]] <- unit(2, 'null') 
> grid.draw(g) 

enter image description here

+0

謝謝,我知道這種做ggplots的方法(我在問題中提到了'grid.arrange'類型的解決方案)。但我不認爲這實際上回答了我的具體問題......我希望最終能夠調整facet_wrap中的y軸,以便我可以使用Shiny中的交互式ggplot2圖表...請參閱刷點示例我在問題中的第一個音頻鏈接中的「facet_wrap」。我不知道這樣的事情甚至可以使用'grob's – FXQuantTrader

+0

brushedPoints的工作原理尚不清楚,我的猜測是它不能識別圖上的各個點,但推斷出覆蓋的x和y座標,並返回落在該區域內的給定data.frame中的任意點。請注意,函數不會從ggplot對象讀取data.frame,但必須明確給出它;另外你必須指定哪些方面正在使用。如果你嘗試以你嘗試的方式結合這兩個功能,你將會有很多工作要做,請嘗試改爲使用兩個單獨的輸出圖小工具。 – MrGumble