从ggplot2 geom_raster()生成分色矩形

时间:2014-02-28 23:20:10

标签: r ggplot2

我一直在尝试使用ggplots / reshape2生成一个2D矩形图,代码如下:

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的图块,它将蓝色作为单独的类别进行着色。我只是想知道是否有办法让它实际上有一个分色瓷砖,使瓷砖颜色为栗色/绿色(如瓷砖的一半是栗色,另一半是绿色)?

谢谢,

1 个答案:

答案 0 :(得分:7)

这比我想要的手动更多一些,但它可以推广到一个单元格中的两个以上的值。这也使用data.table,因为它在&#34; X / Y / Z&#34;中进行了值的转换。融化数据框内的格式很容易:

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))