2016-10-02 57 views
1

假設我有五個不相交的組(即它們重疊)。我想爲每個類別製作Var1與Var2的散點圖。R ggplot方面與非不相交類

更具體地說,考慮一個數據幀,它有兩列Var1和Var2,與五列連接,取值爲0和1,表示每行對五個類別中的每一個的隸屬度。如果這些類是不相交的,我會簡單地對取值爲1到5的變量使用方面網格,並解決問題。但是因爲它們是重疊的,所以我不確定如何製作這樣的情節。

謝謝你的幫助!

+0

爲什麼不包括[再現的示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)與樣本的輸入數據,以更清楚地知道你到底有什麼和你想要什麼。這不是一般的策劃建議的地方。確保你問一個特定的編程問題。 – MrFlick

回答

0

使用tidyr程序包很容易,特別是該程序包中的gather()函數。

首先我創建一個數據框,我認爲它有你想要的屬性。請注意,我使用dplyr,它很棒pipe syntax(這就是下面的%>%)。

# packages we need 
require(tidyr) 
require(dplyr) 
require(ggplot2) 

# an example data frame 
df <- 
    data.frame(var1 = rnorm(30), 
       var2 = rnorm(30), 
       A = sample(c(TRUE, FALSE), 30, replace = T), 
       B = sample(c(TRUE, FALSE), 30, replace = T), 
       C = sample(c(TRUE, FALSE), 30, replace = T), 
       D = sample(c(TRUE, FALSE), 30, replace = T), 
       E = sample(c(TRUE, FALSE), 30, replace = T) 
      ) 

的關鍵步驟是使用rehape tidyr::gather()使得每個數據點(var1, var2)被複制五倍的數據幀,即一次即gather編每一列。除了複製列中的數據而不是gather ed之外,gather()函數還會創建兩個新列。其中的第一個我稱爲class,並且將具有A,B,C,D或E的值。第二個我稱爲is_in,其值爲TRUE或FALSE,取決於相應的數據點是否在類中由class欄所指。

# reshape the data frame using dplyr 
df.reshaped <- 
    df %>% 
     mutate(index = row_number()) %>% # number the data points 
     gather(class, is_in, A:E) %>%  # repeat all (var1, var2) points 5x 
     filter(is_in == TRUE) %>%   # keep only points you want 
     select(-is_in)     # the is_in column is now superfluous 

數據現在已準備好繪圖。爲了驗證我們的圖將在多個方面顯示相同的原始數據點,我在上面輸入mutate()呼叫以便按行號爲所有的原始(即收集之前)的數據點編號。我將使用geom_text()進行繪圖,因此如果我們在不同方面看到相同的數字,則會達到目的。

# plot the graph 
df.reshaped %>% 
    ggplot(aes(x = var1, y = var2, label = index)) + 
     geom_text() + 
     facet_grid(.~class) + 
     theme_bw() 

ggsave('SO_39820087.png', width = 10, height = 4) 

由此產生的情節在我的機器上看起來像這樣。

Successful facet plot of non-disjoint classes