Hoe maak je een heatmap met ggplot2?

Ik probeer een warmtekaart te maken met behulp van ggplot2. Ik vond dit voorbeeld , dat ik eigenlijk probeer om te repliceren met mijn gegevens, maar ik heb problemen. Mijn gegevens zijn een eenvoudig .csv-bestand dat er als volgt uitziet:

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

Ik zou graag een eenvoudige warmtekaart willen maken waarbij de naam van de vrucht op de x-as staat en de persoon op de y-as staat. De grafiek moet vierkanten weergeven waarbij de kleur van elk vierkant een weergave is van het aantal geconsumeerde vruchten. Het vierkant dat overeenkomt met mike: perzik moet het donkerst zijn.

Hier is de code die ik gebruik om te proberen de heatmap te maken:

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

Wanneer ik deze gegevens plot, krijg ik het aantal vruchten op de x-as en de mensen op de y-as. Ik krijg ook geen kleurovergangen die het aantal vruchten vertegenwoordigen. Hoe kan ik de namen van de vruchten op de x-as krijgen met het aantal vruchten dat door een persoon wordt gegeten die wordt weergegeven als een warmtekaart? De huidige output die ik in R krijg ziet er zo uit:

enter image description here

12

1 antwoord

Om eerlijk te zijn @ dr.bunsen - jouw voorbeeld hierboven was slecht reproduceerbaar en je hebt het eerste deel van de tutorial niet gelezen dat je gekoppeld . Dit is waarschijnlijk wat je zoekt:

 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

30
toegevoegd
@ GeekOnAcid Ik heb geprobeerd de bovenstaande code uit te voeren met de gegevens in de oorspronkelijke vraag, maar het faalde met: Fout in opnieuw schalen (waarde): Gebruik: opnieuw schalen (x, nieuw bereik) waarbij x een numeriek object is en nieuw bereik de nieuwe min en max. Wat is het probleem?
toegevoegd de auteur Ali, de bron
@GeekOnAcid perfect!
toegevoegd de auteur Ali, de bron
@AliSharifi Ja, je hebt gelijk - er moeten enkele wijzigingen zijn opgetreden in ggplot2 en andere pakketten die de functie recale hebben verwijderd of naar de andere functie hebben verplaatst. Wat je nodig hebt is om opnieuw schalen te gebruiken in de pakket schalen die de numerieke vector schalen om minimum en maximum te specificeren. Ik heb de code bijgewerkt om volledig reproduceerbaar te zijn.
toegevoegd de auteur Geek On Acid, de bron