2011-12-06 13 views
13

Sto provando a produrre una mappa di calore usando ggplot2. Ho trovato this example, che sto essenzialmente cercando di replicare con i miei dati, ma ho delle difficoltà. I miei dati è un file .csv semplice che assomiglia a questo:Come produrre una heatmap con ggplot2?

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

vorrei produrre una mappa di calore semplice in cui il nome del frutto è l'asse delle ascisse e la persona è in asse y . Il grafico dovrebbe raffigurare quadrati in cui il colore di ogni quadrato è una rappresentazione del numero di frutti consumati. Il quadrato corrispondente a mike:peach dovrebbe essere il più scuro.

Ecco il codice che sto usando per cercare di produrre la mappa termica:

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

Quando ho tracciare questi dati ottengo il numero di frutti sul ascisse e le persone in asse y. Inoltre, non ottengo gradienti di colore che rappresentano il numero di frutti. Come posso ottenere i nomi dei frutti sull'asse x con il numero di frutti mangiati da una persona visualizzata come mappa termica? L'uscita di corrente io sono sempre in R si presenta così:

enter image description here

risposta

30

Per essere onesti @ dr.bunsen - il vostro esempio di cui sopra era mal riproducibile e non ha letto la prima parte del tutorial che vi linked. Qui è probabilmente quello che stai cercando:

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

+0

@GeekOnAcid ho cercato di eseguire il codice di cui sopra con i dati della domanda iniziale, ma non è riuscito con: errore nel ridimensionamento (valore): Uso : rescale (x, newrange) dove x è un oggetto numerico e newrange è il nuovo min e max. Qual è il problema? – Ali

+1

@AliSharifi Sì, hai ragione - ci sono state alcune modifiche in 'ggplot2' e altri pacchetti che hanno rimosso la funzione' recale' o spostato nell'altra funzione. Quello di cui hai bisogno è usare 'rescale' dal pacchetto' scale 'che ridimensiona il vettore numerico per avere il minimo e il massimo specificati. Ho aggiornato il codice per essere completamente riproducibile. –

+0

@GeekOnAcid perfetto! – Ali