Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: yoda230Ответов: 1

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

Я примерно получил левый график, используя 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))

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

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

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

rggplot2heatmap

Ответы

Ответ 1 · рейтинг 1 · MrFlick

Чтобы получить боковой график, вам, вероятно, потребуется преобразовать данные. Вот примерное начало (с использованием данных 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)

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы