R - ggplot2 geom_tile создает путь, отличный от графика к тепловой карте - PullRequest
1 голос
/ 28 апреля 2019

Я хотел бы нарисовать карту тепла для некоторого набора данных. Первоначально я использовал функции тепловых карт с удовлетворительными результатами. Тем не менее, так как все мои другие графики сделаны с ggplot2, я попытался сделать это и с ggplot2. Тем не менее, я получаю странные графики, и я не уверен, в чем причина.

Мне дан следующий набор данных:

 > dput(B)
 structure(list(`2001` = c(510, 15, 14, 9, 8, 11, 7, 5, -1, -3),
 `2002` = c(397, -13, 5, 6, 12, -1, 0, 2, 5, 3), 
 `2003` = c(323, -6, -2, 1, 0, 6, -5, -2, 1, 4), 
 `2004` = c(133, -2, 2, -4, 0, 5, 8, -2, 0, 1), 
 `2005` = c(-100, -8, -6, -2, 1, 2, 2, 3, -6, -5), 
 `2006` = c(-114, -7, 2, -4, -2, 0, 1, 2, 4, -3), 
 `2007` = c(-130,-13, 0, 4, -3, -2, -1, 1, 2, 4), 
 `2008` = c(-38, -10, 4, 0, 3, 4, 2, 0, 0, 1), 
 `2009` = c(-194, -13, -5, -4, -3, -1, 0, 1, 1, 1), 
 `2010` = c(-202, -6, 0, -1, -5, -2, -3, -1, 2, -2)), 
 row.names = 0:9, class = "data.frame")

Сейчас используется,

> heatmap(as.matrix(B), Colv = NA, Rowv = NA, col = cm.colors(10))

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

enter image description here

С другой стороны, с

C <- B
C$size <- row.names(C)
C <- melt(C, variable.name="year",id=c("size"))
ggplot(data = C) +                  
   geom_tile(aes(x = year, y = size, fill = value)) +
   scale_fill_gradientn(colors=cm.colors(10))

Я получаю следующее

enter image description here

Почему это? И как я могу исправить это так, что я получаю сюжет, похожий на первый?

Ответы [ 2 ]

2 голосов
/ 28 апреля 2019

Масштабирование применяется в тепловой карте.Поэтому вам необходимо масштабировать данные (в соответствии с size, в данном случае), чтобы воспроизвести нечто подобное, например:

C2 <- C %>% group_by(size) %>% mutate(rescale = scale(value))

ggplot(data = C2) +                  
  geom_tile(aes(x = year, y = size, fill = rescale)) +
  scale_fill_gradientn(colors=cm.colors(10))

Heatmap using ggplot2 with scaling

Есть и другие варианты, в зависимости от того, что вы пытаетесь визуализировать.Например, посмотрите на limits и values в scale_fill_gradientn.

0 голосов
/ 28 апреля 2019

Проблема в том, что size = 0 имеет гораздо большие числа, чем другие записи.Таким образом, вторая тепловая карта верна, потому что остальные значения очень близки к нулю по отношению к данному масштабу.Я бы сказал, что второе на самом деле правильно, потому что вы можете видеть, что за пределами size = 0 числа примерно одинаковы, особенно в отношении больших чисел, найденных в этом первом ряду.Я не совсем уверен, как работает тепловая карта, и она не предоставляет масштаб, но я думаю, что второй график имеет смысл дать низкую изменчивость за пределами первой строки.

...