Как создать тепловую карту в R с помощью ggplot2


В этом руководстве объясняется, как создать тепловую карту в R с помощью ggplot2.

Пример: создание тепловой карты в R

Чтобы создать тепловую карту, мы будем использовать встроенный набор данных R mtcars .

#view first six rows of *mtcars*head(mtcars)

# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
#Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
#Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
#Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
#Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1

В настоящее время mtcars имеет широкий формат, но нам нужно преобразовать его в длинный формат, чтобы создать тепловую карту.

#load *reshape2* package to use melt() function
library(reshape2)

#melt mtcars into long format
melt_mtcars <- melt(mtcars)

#add column for car name
melt_mtcars$car <- rep(row.names(mtcars), 11)

#view first six rows of *melt_mtcars*
head(melt_mtcars)

# variable value car
#1 mpg 21.0 Mazda RX4
#2 mpg 21.0 Mazda RX4 Wag
#3 mpg 22.8 Datsun 710
#4 mpg 21.4 Hornet 4 Drive
#5 mpg 18.7 Hornet Sportabout
#6 mpg 18.1 Valiant

Мы можем использовать следующий код для создания тепловой карты в ggplot2:

library(ggplot2)

ggplot(melt_mtcars, aes(variable, car)) +
 geom_tile(aes(fill = value),colour = "white") +
 scale_fill_gradient(low = "white",high = "red") 
тепловая карта в ggplot2

К сожалению, поскольку значения disp намного больше, чем значения всех других переменных во фрейме данных, трудно увидеть изменение цвета для других переменных.

Один из способов решить эту проблему — изменить масштаб значений каждой переменной с 0 на 1, используя функцию rescale () в пакете scales() и функцию ddply() в пакете plyr():

#load libraries
library(plyr)
library(scales)

#rescale values for all variables in melted data frame
melt_mtcars <- ddply(melt_mtcars, .(variable), transform, rescale = rescale(value))

#create heatmap using rescaled values
ggplot(melt_mtcars, aes(variable, car)) +
 geom_tile(aes(fill = rescale), colour = "white") +
 scale_fill_gradient(low = "white", high = "red")
Тепловая карта с перемасштабированными значениями в R

Мы также можем изменить цвета тепловой карты, изменив цвета, используемые в аргументе scale_fill_gradient():

#create heatmap using blue color scale
ggplot(melt_mtcars, aes(variable, car)) +
 geom_tile(aes(fill = rescale), colour = "white") +
 scale_fill_gradient(low = "white", high = "steelblue") 
Тепловая карта в R с использованием ggplot2 и синей цветовой шкалы

Обратите внимание, что тепловая карта в настоящее время упорядочена по названию автомобиля. Вместо этого мы могли бы упорядочить тепловую карту в соответствии со значениями одной из переменных, таких как mpg , используя следующий код:

#define car name as a new column, then order by *mpg* descending
mtcars$car <- row.names(mtcars)
mtcars$car <- with(mtcars, reorder(car, mpg))

#melt mtcars into long format
melt_mtcars <- melt(mtcars)

#rescale values for all variables in melted data frame
melt_mtcars <- ddply(melt_mtcars, .(variable), transform, rescale = rescale(value))

#create heatmap using rescaled values
ggplot(melt_mtcars, aes(variable, car)) +
 geom_tile(aes(fill = rescale), colour = "white") +
 scale_fill_gradient(low = "white", high = "steelblue") 
Тепловая карта в ggplot2 с использованием упорядоченных значений

Чтобы упорядочить тепловую карту по возрастанию миль на галлон , нам просто нужно использовать -mpg в аргументе reorder():

#define car name as a new column, then order by mpg descending
mtcars$car <- row.names(mtcars)
mtcars$car <- with(mtcars, reorder(car, -mpg ))

#melt mtcars into long format
melt_mtcars <- melt(mtcars)

#rescale values for all variables in melted data frame
melt_mtcars <- ddply(melt_mtcars, .(variable), transform, rescale = rescale(value))

#create heatmap using rescaled values
ggplot(melt_mtcars, aes(variable, car)) +
 geom_tile(aes(fill = rescale), colour = "white") +
 scale_fill_gradient(low = "white", high = "steelblue") 
Тепловая карта в R с использованием ggplot2

Наконец, мы можем удалить метки осей X и Y вместе с легендой, если нам не нравится, как она выглядит, используя аргументы labs() и theme():

#create heatmap with no axis labels or legend
ggplot(melt_mtcars, aes(variable, car)) +
 geom_tile(aes(fill = rescale), colour = "white") +
 scale_fill_gradient(low = "white", high = "steelblue") +
 labs(x = "", y = "") +
 theme(legend.position = "none") 
Тепловая карта ggplot2 без меток оси или легенды
Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.