2014-04-09 75 views
1

本質上,我有一個數據集,其中我有4列包含以下信息:個人(「Ind」),這些人所屬的地理人口(「Pop」),屬於cluster1的基因組比例和屬於cluster2的基因組比例(後兩者合計爲1)。ggplot2 - 創建堆疊直方圖的比例爲人口,並按人口分離

例子:

Ind <- c(1:20) 
    Pop <- rep(1:2, each = 10) 
    set.seed(234) 
    Cluster1 <- runif(20, 0.0, 1.0) 
    Cluster2 <- 1-Cluster1 
    df <- data.frame(Ind, Pop, Cluster1, Cluster2) 

數據:

Ind Pop Cluster1 Cluster2 
1 1 1 0.745619998 0.25438000 
2 2 1 0.781712425 0.21828758 
3 3 1 0.020037114 0.97996289 
4 4 1 0.776085387 0.22391461 
5 5 1 0.066910093 0.93308991 
6 6 1 0.644795124 0.35520488 
7 7 1 0.929385959 0.07061404 
8 8 1 0.717642189 0.28235781 
9 9 1 0.927736510 0.07226349 
10 10 1 0.284230120 0.71576988 
11 11 2 0.555724930 0.44427507 
12 12 2 0.547701653 0.45229835 
13 13 2 0.582847855 0.41715215 
14 14 2 0.582989913 0.41701009 
15 15 2 0.001198341 0.99880166 
16 16 2 0.441117854 0.55888215 
17 17 2 0.313152501 0.68684750 
18 18 2 0.740014466 0.25998553 
19 19 2 0.138326844 0.86167316 
20 20 2 0.871777777 0.12822222 

我想嘗試併產生使用ggplot2類似於 「A」 面板this圖的曲線圖。在這個圖中,每個個體都是一個具有每個羣集比例的柱狀圖,但是x個蜱是種羣,垂直網格將這些種羣分開。我知道如果忽略Pop並使用melt(),我可以輕鬆生成堆疊直方圖。但我想知道如何合併Pop以製作出典雅的情節,例如上面鏈接中的情節。

謝謝!

回答

1

如何將IndPop作爲id變量熔化,並用facet_grid來表示?這不是100%像你要找的情節,但得到相當接近的幾個主題調整:

dfm <- melt(df, id = c("Ind", "Pop")) 
ggplot(dfm, aes(Ind, value, fill = variable)) + 
    geom_bar(stat="identity", width = 1) + 
    facet_grid(~Pop, scales = "free_x") + 
    scale_y_continuous(name = "", expand = c(0, 0)) + 
    scale_x_continuous(name = "", expand = c(0, 0), breaks = dfm$Ind) + 
    theme(
     panel.border = element_rect(colour = "black", size = 1, fill = NA), 
     strip.background = element_rect(colour = "black", size = 1), 
     panel.margin = unit(0, "cm"), 
     axis.text.x = element_blank() 
    ) 

ggplot example

UPDATE:我的例子不能覆蓋多個羣體不均勻的數字更復雜的情況下,的個人。快速修正來處理這種情況下,使用spaces = "free_x"屬性,完整的代碼,例如:

require(ggplot2) 
require(reshape2) 
require(grid) 

Ind <- c(1:30) 
Pop <- rep(paste("Pop", 1:3), times = c(5, 15, 10)) 
set.seed(234) 
Cluster1 <- runif(30, 0.0, 1.0) 
Cluster2 <- 1-Cluster1 
df <- data.frame(Ind, Pop, Cluster1, Cluster2) 

dfm <- melt(df, id = c("Ind", "Pop")) 
ggplot(dfm, aes(Ind, value, fill = variable)) + 
    geom_bar(stat="identity", width = 1) + 
    facet_grid(~Pop, scales = "free_x", space = "free_x") + 
    scale_y_continuous(name = "", expand = c(0, 0)) + 
    scale_x_continuous(name = "", expand = c(0, 0), breaks = dfm$Ind) + 
    theme(
     panel.border = element_rect(colour = "black", size = 1, fill = NA), 
     strip.background = element_rect(colour = "black", size = 1), 
     panel.margin = unit(0, "cm"), 
     axis.text.x = element_blank() 
    ) 

ggplot example2

+0

感謝您的快速回復,這絕對是有希望的,但我給的例子是好的,甚至,在現實中,我處理的是每個人羣中個人數量不均勻的情況,我希望每個「geom_bar」的寬度在羣組之間保持一致。使用'facet_grid'是一個很好的解決方案,但就我的探索而言,我不能根據每個方面的個體數量來改變寬度... –

+0

啊,好點,我忽略了這一點。您可以使用固定空間來解決問題。我將編輯我的答案以添加代碼示例。 – sebkopf