Как создать тепловую карту с помощью ggplot2? - PullRequest
14 голосов
/ 07 декабря 2011

Я пытаюсь создать карту тепла, используя ggplot2.Я нашел этот пример , который я по сути пытаюсь воспроизвести с моими данными, но у меня возникли трудности.Мои данные - это простой файл .csv, который выглядит следующим образом:

people,apple,orange,peach
mike,1,0,6
sue,0,0,1
bill,3,3,1
ted,1,1,0

Я хотел бы создать простую тепловую карту, где имя фрукта находится на оси х, а человек - на оси-ось.График должен изображать квадраты, где цвет каждого квадрата представляет количество потребляемых фруктов.Квадрат, соответствующий mike:peach, должен быть самым темным.

Вот код, который я использую для создания тепловой карты:

data <- read.csv("/Users/bunsen/Desktop/fruit.txt", head=TRUE, sep=",")
fruit <- c(apple,orange,peach)
people <- data[,1]
(p <- ggplot(data, aes(fruit, people)) + geom_tile(aes(fill = rescale), colour = "white") +    scale_fill_gradient(low = "white", high = "steelblue"))

Когда я строю эти данные, я получаю количество фруктов на оси х и людей на оси-ось.Я также не получаю цветные градиенты, представляющие количество фруктов.Как я могу получить названия фруктов на оси х с количеством фруктов, съеденных человеком, отображаемым в виде тепловой карты?Токовый выход, который я получаю в R, выглядит так:

enter image description here

Ответы [ 2 ]

32 голосов
/ 07 декабря 2011

Честно говоря, @ dr.bunsen - приведенный выше пример плохо воспроизводим, и вы не читали первую часть учебника, с которой вы связали .Вот, наверное, то, что вы ищете:

 library(reshape)
 library(ggplot2)
 library(scales)

 data <- structure(list(people = structure(c(2L, 3L, 1L, 4L), 
                                           .Label = c("bill", "mike", "sue", "ted"), 
                                           class = "factor"), 
                        apple = c(1L, 0L, 3L, 1L), 
                        orange = c(0L, 0L, 3L, 1L), 
                        peach = c(6L, 1L, 1L, 0L)), 
                    .Names = c("people", "apple", "orange", "peach"),
                    class = "data.frame", 
                    row.names = c(NA, -4L))
 data.m <- melt(data)
 data.m <- ddply(data.m, .(variable), transform, rescale = rescale(value))
 p <- ggplot(data.m, aes(variable, people)) + 
         geom_tile(aes(fill = rescale), colour = "white") 
 p + scale_fill_gradient(low = "white", high = "steelblue")

enter image description here

1 голос
/ 04 декабря 2018

Через семь (!) Лет лучший способ правильно отформатировать ваши данные - использовать tidyr вместо reshape

Используя gather из tidyr, очень легко переформатироватьваши данные, чтобы получить ожидаемые 3 столбца (person для оси Y, fruit для оси X и count для значений):

library("dplyr")
library("tidyr")

hm <- readr::read_csv("people,apple,orange,peach
mike,1,0,6
sue,0,0,1
bill,3,3,1
ted,1,1,0")

hm <- hm %>%
  gather(fruit, count, apple:peach)
  #syntax: key column (to create), value column (to create), columns to gather (will become (key, value) pairs)

Данные теперь выглядят так:

# A tibble: 12 x 3
   people fruit  count
   <chr>  <chr>  <dbl>
 1 mike   apple      1
 2 sue    apple      0
 3 bill   apple      3
 4 ted    apple      1
 5 mike   orange     0
 6 sue    orange     0
 7 bill   orange     3
 8 ted    orange     1
 9 mike   peach      6
10 sue    peach      1
11 bill   peach      1
12 ted    peach      0

Отлично!Давайте начнем заговор.Основной geom для создания тепловой карты с ggplot2 - geom_tile, для которой мы предоставим эстетические x, y и fill.

library("ggplot2")
ggplot(hm, aes(x=x, y=y, fill=value)) + geom_tile() 

first attempt

Хорошо, не так уж плохо, но мы можем сделать намного лучше.

  • Для тепловых карт мне нравится черно-белая тема theme_bw(), которая избавляется от серого фона.
  • Мне также нравится использовать палитру из RColorBrewerdirection = 1, чтобы получить более темные цвета для более высоких значений или -1 в противном случае).Доступно множество палитр: Reds, Blues, Spectral, RdYlBu (красно-желтый-синий), RdBu (красно-синий) и т. Д. Ниже я использую «Greens».Запустите RColorBrewer::display.brewer.all(), чтобы увидеть, как выглядят палитры.

  • Если вы хотите, чтобы плитки были в квадрате, просто используйте coord_equal().

  • Я часто нахожу легенду бесполезной, но это зависит от вашего конкретного случая использования.Вы можете скрыть легенду fill с помощью guides(fill=F).

  • Вы можете напечатать значения поверх плиток, используя geom_text (или geom_label).Требуется эстетика x, y и label, но в нашем случае x и y наследуются.Вы также можете печатать более высокие значения, передавая size=count в качестве эстетики - в этом случае вы также захотите передать size=F в guides, чтобы скрыть легенду о размере.

  • Вы можете рисовать линии вокруг плиток, передавая color в geom_tile.

Соединяя все вместе:

ggplot(hm, aes(x=fruit, y=people, fill=count)) +
  # tile with black contour
  geom_tile(color="black") + 
  # B&W theme, no grey background
  theme_bw() + 
  # square tiles
  coord_equal() + 
  # Green color theme for `fill`
  scale_fill_distiller(palette="Greens", direction=1) + 
  # printing values in black
  geom_text(aes(label=count), color="black") +
  # removing legend for `fill` since we're already printing values
  guides(fill=F) +
  # since there is no legend, adding a title
  labs(title = "Count of fruits per person")

Final heatmap

Чтобы удалить что-либо, просто удалите соответствующую строку.

...