Как создать график geom_line над тепловой картой?

Я пытаюсь создать тепловую карту данных циркадной экспрессии генов и над ней показать измеренное поведение.

я хочу, чтобы это выглядело примерно так: введите здесь описание изображения

Обратите внимание, что 2 красные точки должны быть выше CT13 и CT37 (соответственно)...

это код, который я пытался использовать, но он создает 2 отдельных графика:

library(pheatmap)
library(RColorBrewer)
library(ggplot2)

# prepare data for Heat map:
my_heatmap <- read.csv("circ_genes.csv", header = TRUE)
mymat <- my_heatmap[,c(2:13)]
rownames(mymat) <- paste("Gene", my_heatmap[,1], sep="_")
mydf <- data.frame(row.names = paste("Gene", my_heatmap[,1], sep="_"), 
category = my_heatmap[,14])
my_palette <- colorRampPalette(c("blue", "white", "red"))(n = 1000)

# prepare data for line graph
behavior_LD <- read.csv("behavior.csv", header = TRUE)
CT <- behavior_LD$CT
CT <- as.character(CT)
behavior_LD$CT <- factor(behavior_LD$CT, levels = CT )
mycolours <- c("H1" = "red", "H0" = "black")

behavePlot <- ggplot(data=behavior_LD, aes(x=CT, y=Average, group=1)) +
  geom_line()+
  geom_point(aes(colour = factor(highlight)), size = 3) +
  geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), width=.1)+
  scale_color_manual(values = mycolours) + theme(legend.position="none") +
  theme(axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank()) +
  theme(plot.margin=unit(c(5,2,5,2),"cm"))

# plot 2 graphs
par(mfrow=c(2,1))

behavePlot

pheatmap(mymat, color = my_palette, legend_labels = "Clusters", cluster_cols 
= F, cluster_rows = F, annotation_row = mydf, gaps_row = c(43, 60, 88, 124), 
annotation_names_row = FALSE, show_rownames = FALSE )

файлы, которые я использовал, можно найти здесь: https://www.dropbox.com/sh/n3mplr0fdz7oh6f/AACU_CdVjT6OmJLzrKmAtxj2a?dl=0

спасибо за помощь!


person Eviatar Nov Weizman    schedule 24.01.2018    source источник
comment
При условии, что вывод pheatmap исходит из ggplot2, существует ряд пакетов, которые могут помочь вам в этом. gridExtra, cowplot, patchwork, egg.   -  person Jake Kaupp    schedule 24.01.2018
comment
pheatmap имеет возвращаемое значение list, но это один из элементов списка gtable. Некоторые приемы, используемые различными пакетами для выравнивания по осям слева и справа, могут работать не так, как ожидалось.   -  person hrbrmstr    schedule 24.01.2018


Ответы (1)


Во-первых, удалите

theme(plot.margin=unit(c(5,2,5,2), "cm")) 

из вашего кода диаграммы верхней строки.

Затем просто заполните недостающие столбцы в каждом gtable и добавьте отступы:

library(gtable)
library(grid.arrange)

top <- ggplotGrob(behavePlot)
bot <- phm$gtable

bot1 <- gtable_add_cols(bot, unit.c(top$widths[[1]], top$widths[[2]], top$widths[[3]]), 0)
top1 <- gtable_add_cols(top, bot$widths[[6]])

grid.newpage()
grid.draw(
  gtable_add_padding(
    arrangeGrob(top1, bot1, ncol=1, nrow=2, heights=c(0.2, 0.8)),
    unit(c(0, 2, 0, 2), "lines")
  )
)

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

ПРИМЕЧАНИЕ: это небольшой хак, который позволяет достичь желаемого результата, но очень хрупок. Надеюсь, Клаус заметит этот вопрос и предложит вам более элегантное решение.

person hrbrmstr    schedule 24.01.2018