График типа тепловой карты R с частотным графиком

Я пытаюсь создать график, подобный следующему: тепловая карта с частотным графиком

Я примерно получил левый график, используя geom_tile() из ggplot2, но я не могу понять, как сгенерировать правый график и как собрать два графика вместе.

Пример:

tt <- structure(list(Gene = structure(c(3L, 1L, 2L, 4L, 4L, 4L, 2L, 3L, 1L, 3L, 1L, 2L, 1L, 2L, 4L), .Label = c("A", "B", "C", "D"), class = "factor"), tumour.sample = structure(c(1L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 3L, 3L, 4L, 4L, 2L), .Label = c("1", "5", "3", "4", "2", "6"), class = "factor"), Effect = c("missense", "missense", "missense", "missense", "missense", "missense", "missense", "nonsense", "missense", "missense", "missense", "missense", "missense", "nonsense", "missense")), .Names = c("Gene", "tumour.sample", "Effect"), row.names = c(1L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 18L), class = "data.frame")
ggplot(tt, aes(x=Gene, y=tumour.sample)) + geom_tile(aes(fill=Effect)) + theme(axis.text.x = element_text(angle = -90, hjust = 0))

Каков наилучший подход для этого?

На данный момент на тепловой карте нет меток вверху, а поля не квадратные.


person yoda230    schedule 10.06.2014    source источник
comment
Этот вопрос касается программирования, и я думаю, что его следует опубликовать на SO.   -  person Stat    schedule 10.06.2014
comment
С gridExtra::grid.arrange легко собрать графики вместе. Подробности и другие варианты см. в этом вопросе.   -  person Gregor Thomas    schedule 10.06.2014


Ответы (1)


Чтобы получить боковой график, вам, вероятно, потребуется преобразовать данные. Вот примерное начало (с использованием данных tt сверху)

p1<-ggplot(tt, aes(x=Gene, y=tumour.sample)) + 
    geom_tile(aes(fill=Effect)) + 
    theme(axis.text.x = element_text(angle = -90, hjust = 0)) + 
    scale_fill_discrete(guide=F) 

#transform and summarize
rs<-do.call(rbind, Map(function(a,b) {
    data.frame(s=b, i=seq_along(a), eff=sort(a))},
lapply(split(tt, tt$tumour.sample), '[[', "Effect"), 
levels(factor(tt$tumour.sample))))

#make side plot
p2<-ggplot(rs, aes(x=i, y=s)) + 
    geom_tile(aes(fill=eff)) +
    theme(axis.text.y=element_blank(), axis.title.y=element_blank()) 

#print both plots
grid.arrange(p1, p2, ncol=2)

введите здесь описание изображения

person MrFlick    schedule 10.06.2014
comment
В конце концов я свернул матрицу с помощью ddply, добавив индекс позиции. - person yoda230; 13.06.2014