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:

enter image description here

Était-ce utile?

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")

enter image description here

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() 

first attempt

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 (avec direction = 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". Courir RColorBrewer::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 avec guides(fill=F).

  • Vous pouvez imprimer les valeurs au-dessus des tuiles en utilisant geom_text (ou geom_label). Il faut une esthétique x, y et label Mais dans notre cas, x et y sont hérités. Vous pouvez également imprimer des valeurs plus élevées en passant size=count En tant qu'esthétique - dans ce cas, vous voudrez également passer size=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")

Final heatmap

Pour supprimer tout, supprimez simplement la ligne correspondante.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top