2011-12-06 12 views
13

Estoy tratando de producir un mapa de calor usando ggplot2. Encontré this example, que estoy tratando de replicar con mis datos, pero estoy teniendo dificultades. Mis datos es un simple archivo .csv que tiene este aspecto:¿Cómo se produce un mapa de calor con ggplot2?

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

me gustaría producir un simple mapa de calor en el que el nombre de la fruta está en el eje X y la persona está en el eje y . El gráfico debe representar cuadrados donde el color de cada cuadrado es una representación de la cantidad de fruta consumida. El cuadrado correspondiente a mike:peach debe ser el más oscuro.

Aquí está el código que estoy utilizando para tratar de producir el mapa de calor:

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

Cuando una de sus parcelas de datos consigo el número de frutos en el eje X y la gente en el eje y. Tampoco obtengo gradientes de color que representen la cantidad de fruta. ¿Cómo puedo obtener los nombres de las frutas en el eje x con la cantidad de fruta que come una persona que se muestra como un mapa de calor? La salida de corriente que estoy recibiendo en I es el siguiente:

enter image description here

Respuesta

30

para ser honesto @ dr.bunsen - el ejemplo anterior era poco reproducible y que no leyó la primera parte del tutorial que se linked. Esto es probablemente lo que busca:

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 Traté de ejecutar el código anterior con los datos de la pregunta original, pero falló con: Error en reescalar (valor): Uso : reescalar (x, newrange) donde x es un objeto numérico y newrange es el nuevo min y max. ¿Cuál es el problema? – Ali

+1

@AliSharifi Sí, tienes razón; debe haber habido algunos cambios en 'ggplot2' y otros paquetes que eliminaron la función' recale' o la cambiaron a la otra función. Lo que necesita es usar 'reescalar' del paquete' escalas' que redimensionan el vector numérico para tener el mínimo y el máximo especificados. Actualicé el código para que sea totalmente reproducible. –

+0

@GeekOnAcid perfecto! – Ali

Cuestiones relacionadas