Comment produire une carte thermique avec GGPLOT2?
Question
J'essaie de produire une carte thermique en utilisant GGPLOT2. j'ai trouvé cet exemple, que j'essaie essentiellement de reproduire avec mes données, mais j'ai des difficultés. Mes données sont un fichier .csv simple qui ressemble à ceci:
people,apple,orange,peach
mike,1,0,6
sue,0,0,1
bill,3,3,1
ted,1,1,0
Je voudrais produire une carte thermique simple où le nom du fruit est sur l'axe des x et la personne est sur l'axe y. Le graphique doit représenter des carrés où la couleur de chaque carré est une représentation du nombre de fruits consommés. Le carré correspondant à mike:peach
devrait être le plus sombre.
Voici le code que j'utilise pour essayer de produire la carte thermique:
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"))
Lorsque je trace ces données, je reçois le nombre de fruits sur l'axe X et les personnes sur l'axe Y. Je n'obtiens pas non plus de gradients de couleur représentant le nombre de fruits. Comment puis-je obtenir les noms des fruits de l'axe X avec le nombre de fruits consommés par une personne affichée comme carte thermique? La sortie actuelle que je reçois dans R ressemble à ceci:
La solution
Pour être honnête @ Dr.Bunsen - Votre exemple ci-dessus était mal reproductible et vous n'avez pas lu la première partie du tutoriel que vous lié. Voici probablement ce que vous recherchez:
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")
Autres conseils
Sept (!) Ans plus tard, La meilleure façon de formater correctement vos données est d'utiliser tidyr
plutôt que reshape
Utilisant gather
de tidyr
, il est très facile de reformater vos données pour obtenir les 3 colonnes attendues (person
pour l'axe y, fruit
pour l'axe x et count
pour les valeurs):
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)
Les données ressemblent maintenant à:
# 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
Parfait! Allons complot. Le géom de base pour faire une carte thermique avec GGPLOT2 est geom_tile
à quoi nous fournirons esthétique x
, y
et fill
.
library("ggplot2")
ggplot(hm, aes(x=x, y=y, fill=value)) + geom_tile()
Ok pas trop mal mais nous pouvons faire beaucoup mieux.
- Pour les thermaps, j'aime le thème noir et blanc
theme_bw()
qui se débarrasse du fond gris. J'aime aussi utiliser une palette de
RColorBrewer
(avecdirection = 1
Pour obtenir les couleurs les plus sombres pour des valeurs plus élevées, ou -1 sinon). Il y a beaucoup de palettes disponibles: rouges, blues, spectraux, rdylbu (bleu-bleu-bleu), rdbu (bleu rouge), etc. ci-dessous j'utilise des "verts". CourirRColorBrewer::display.brewer.all()
Pour voir à quoi ressemblent les palettes.Si vous voulez que les carreaux soient au carré, utilisez simplement
coord_equal()
.Je trouve souvent que la légende n'est pas utile mais elle dépend de votre cas d'utilisation particulier. Vous pouvez cacher le
fill
légende avecguides(fill=F)
.Vous pouvez imprimer les valeurs au-dessus des tuiles en utilisant
geom_text
(ougeom_label
). Il faut une esthétiquex
,y
etlabel
Mais dans notre cas,x
ety
sont hérités. Vous pouvez également imprimer des valeurs plus élevées en passantsize=count
En tant qu'esthétique - dans ce cas, vous voudrez également passersize=F
àguides
Pour cacher la légende de la taille.Vous pouvez tracer des lignes autour des carreaux en passant un
color
àgeom_tile
.
Mettre tous ensemble:
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")
Pour supprimer tout, supprimez simplement la ligne correspondante.