2016-05-10 55 views
10

將多變量facet_wrap標籤我使用facet_wrap分裂我的散點圖如GGPLOT2:在一行

facet_wrap(x~y+z) 

這根據需要在我的情況產生22個地塊。然而,這22個圖中的每一個的標籤都顯示在3行(x,y和z)中,這些行不必要地佔用了窗口中的空間,並將圖塊擠壓成一個小區域。我寧願讓我的地塊規模更大。由於變量y和z很短,我想將它們顯示在同一行而不是兩個。

我看着貼標機的選項,但他們似乎沒有做我想做的。我希望在這裏提出任何建議。

回答

9

在這種情況下,你也可以考慮label_wrap_gen()

p <- ggplot(mtcars, aes(wt,mpg)) + geom_point() 
p + facet_wrap(cyl~am+vs, labeller = label_wrap_gen(multi_line=FALSE)) 

更多細節也herehere看。

6

我不知道如何用標籤功能做到這一點,但另一種選擇是創建一個分組變量,將所有三個分類變量組合成一個可用於分面的變量。下面是一個使用內置mtcars數據框和dplyr程序包實時創建新分組變量的示例。接下來是一個更新函數,它允許從一個到三個分面變量進行動態選擇。

library(dplyr) 

ggplot(mtcars %>% mutate(group = paste(cyl,am,vs, sep="-")), 
     aes(wt,mpg)) + 
    geom_point() + 
    facet_wrap(~group) 

enter image description here

UPDATE:關於關於靈活性的評論,下面的代碼是一個函數,其允許用戶輸入所需的數據幀和變量名,包括動態選擇到小面的一個,兩列或三列。

library(dplyr) 
library(lazyeval) 

mygg = function(dat, v1, v2, f1, f2=NA, f3=NA) { 

    dat = dat %>% 
    mutate_(group = 
       if (is.na(f2)) { 
       f1 
       } else if (is.na(f3)) { 
       interp(~paste(f1,f2, sep='-'), f1=as.name(f1), f2=as.name(f2)) 
       } else { 
       interp(~paste(f1,f2,f3,sep='-'), f1=as.name(f1), f2=as.name(f2), f3=as.name(f3)) 
       }) 

    ggplot(dat, aes_string(v1,v2)) + 
    geom_point() + 
    facet_wrap(~group) 
} 

現在,讓我們嘗試一下功能:

library(vcd) # For Arthitis data frame 

mygg(Arthritis, "ID","Age","Sex","Treatment","Improved") 
mygg(mtcars, "wt","mpg","cyl","am") 
mygg(iris, "Petal.Width","Petal.Length","Species") 

enter image description here

+0

謝謝,這確實有效。但是,我想知道是否有一種方法可以使用ggplot2參數來執行此操作。我可能想要使用不同的變量來對我的圖進行構圖,並且還希望避免已經很大的數據表中的冗餘。 – beeprogrammer

+1

查看更新的答案。另請注意,代碼不會將任何列添加到數據框對象。額外的列僅在ggplot函數中添加,並且不會更改數據框對象本身。 – eipi10