Генерация цветных прямоугольников из ggplot2 geom_raster()

Я пытался сгенерировать 2D прямоугольные графики, используя 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 она выделяется синим цветом в качестве отдельной категории, как и должно быть. Мне было просто интересно, есть ли способ сделать так, чтобы на самом деле была мозаика с разноцветными цветами, чтобы цвет плитки был бордовый / зеленый (например, половина плитки - бордовая, а другая половина - зеленая)?

Спасибо,

1 ответ

Решение

Это немного больше руководства, чем хотелось бы, но оно обобщает более двух значений в ячейке. Это также использует 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')

Обратите внимание, я сделал ваш набор данных немного более интересным, добавив один блок с тремя значениями (а также, что это с geom_tile, а не растр, который, мы надеемся, не является нарушителем соглашения).

m <- structure(c("SNV", "SNV", NA, NA, "INDEL/POS/NEG", "SNV", "INDEL", 
            "SNV", "SNV/INDEL"), .Dim = c(3L, 3L))
Другие вопросы по тегам