2016-11-15 103 views
3

下面是一個包含30個獨特樣本(ID 1到30)的示例數據框,每個樣本有三個測量(在三個不同的閾值('G1'列); 5e-03,5e -05,5e-08)。 90個觀測值中的每一個都有一個p值(P列)。最後,每個三十樣本可以屬於十個不同類別之一(「G2」)凹凸類別上的方面barplot

# example data.frame 
df <- data.frame(
    'ID' = as.character(unlist(lapply(seq(1:30), function(x) rep(x,3)))), 
    'P' = runif(n = 90, min = 0, max = 1), 
    'G1' = as.character(c('5e-03','5e-05','5e-08')), 
    'G2' = as.character(unlist(lapply(sample(1:10, size = 30, replace = T), function(x) rep(x,3)))) 
) 

我可以使用這個命令產生一個很好的酒吧情節[對不起,所有的數值變量!]。

ggplot(df, aes(x = interaction(ID,G2), y = P, fill = G2)) + 
    geom_bar(stat = 'identity') + 
    coord_flip() + 
    facet_grid(. ~ G1) 

,看起來像這樣:

Plot 1: image with one facet, and 'G2' visualised using colour

不過,我真的很想做的是有兩個方面;列上的'G1'(就像它當前的那樣),而不是使用條形顏色來劃分'G2'變量,我想要G2上的第二個水平面。這是我所嘗試過的:

ggplot(df, aes(x = interaction(ID,G2), y = P, fill = G2)) + 
    geom_bar(stat = 'identity') + 
    coord_flip() + 
    facet_grid(G2 ~ G1) 

這是不對的。當我面向G2時,它在每個方面繪製全部個樣本。這很難看,因爲每個樣本只能屬於一個G2類別。如何生成僅包含屬於該組的柱的第二個方面?我曾嘗試調整facet_grid中的'drop','scale'和'space'變量,但它並沒有改進。

This是我正在尋找 - 我已經手動繪製應該在方面的陰謀部分的矩形。它基本上與曲線1相同,除了條被分成G2曲面。

+0

你爲什麼要加coord_flip()?刪除它並再次運行相同的代碼。我想這就是你要找的 –

+0

感謝您的答覆。刪除coord_flip()並不能解決問題,但G2方面仍在繪製未觀察到的數據。我正在使用coord_flip(),因爲我希望整個頁面上的情節出於審美原因。 – mbyvcm

+0

也許改變互動來粘貼? '粘貼(ID,G2,sep =「。」)' – zx8754

回答

2

首先需要注意的是,由於您正在使用G2和G1,因此您不再需要x=interaction(ID,G2)x=ID就足夠了。

默認情況下,一個繪圖的所有刻面共享x和y軸的相同刻度。但你可以改變,隨着scales參數

ggplot(df, aes(x = ID, y = P, fill = G2)) + 
    geom_bar(stat = 'identity') + 
    facet_grid(G1 ~ G2, scales="free_x") 

注意,我換G1和G2在網格的定義。但我認爲它不可能使其與coord_flip()一起工作。

+0

謝謝皮埃爾!你幾乎解決了它,非常感謝!有沒有什麼辦法讓所有單獨的酒吧有相同的寬度?你的解決方案會導致一些酒吧延伸填補方面。 – mbyvcm

1

只是增加了皮埃爾答案:

ggplot(df, aes(x = ID, y = P, fill = G2)) + 
    geom_bar(stat = 'identity') + 
    facet_grid(G1 ~ G2, scales="free", space="free") 

這將給予相同的寬度爲每一個酒吧。

+0

非常好的庫馬爾!這是一個恥辱,沒有辦法與coord_flip()一起做到這一點。但我可以忍受這一點! – mbyvcm