Как создать тепловую карту в 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") 

К сожалению, поскольку значения 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")

Мы также можем изменить цвета тепловой карты, изменив цвета, используемые в аргументе 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") 

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

Чтобы упорядочить тепловую карту по возрастанию миль на галлон , нам просто нужно использовать -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") 

Наконец, мы можем удалить метки осей 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")