2014-02-28 67 views
4

我一直在嘗試使用二維直角座標圖ggplots/reshape2用這樣的代碼來生成:生成分割彩色矩形()

library(reshape2) 
library(ggplot2) 
m <- matrix(c('SNV', 'SNV', NA, NA, 'INDEL', 'SNV', 'INDEL', 'SNV', 'SNV/INDEL'), 3, 3) 
ggplot(melt(m), aes(Var1,Var2, fill=value)) + geom_raster() + xlab('Patient') + ylab('Gene') 

注意如何爲具有SNV瓦/ INDEL將它作爲一個單獨的類別將其顏色設爲藍色。我只是想知道是否有辦法讓它實際上有一塊分色瓷磚,這樣瓷磚的顏色就變成了栗色/綠色(比如一半的瓷磚是褐紅色,另一半是綠色的)?

感謝,

回答

7

這比我想要多一點手動,但它推廣到多於兩個值的小區內。這也採用data.table,只是因爲它使價值觀的轉變在「X/Y/Z」熔化的數據幀中的格式幸福很簡單:

library(data.table) 
dt <- data.table(melt(m)) 
dt <- dt[, strsplit(as.character(value), "/"), by=list(Var1, Var2)] # this expands "X/Y/Z" into three rows 
dt[, shift:=(1:(.N))/.N - 1/(2 * .N) - 1/2, by=list(Var1, Var2)] 
dt[, height:=1/.N, by=list(Var1, Var2)] 
ggplot(dt, aes(Var1,y=Var2 + shift, fill=V1, height=height)) + 
    geom_tile(color="yellow", size=1) + xlab('Patient') + ylab('Gene') 

enter image description here

注意我做你的數據集一點通過添加一個帶有三個值的盒子更有趣(並且這與geom_tile,而不是光柵,希望不是交易斷路器)。

m <- structure(c("SNV", "SNV", NA, NA, "INDEL/POS/NEG", "SNV", "INDEL", 
      "SNV", "SNV/INDEL"), .Dim = c(3L, 3L)) 
+0

這真是一個很棒的答案!非常感謝。 – TinyHeero