rggplot2heatmap

How to produce a heatmap with ggplot2?


I am trying to produce a heat map using ggplot2. I found this example, which I am essentially trying to replicate with my data, but I am having difficulty. My data is a simple .csv file that looks like this:

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

I would like to produce a simple heat map where the name of the fruit is on the x-axis and the person is on the y-axis. The graph should depict squares where the color of each square is a representation of the number of fruit consumed. The square corresponding to mike:peach should be the darkest.

Here is the code I am using to try to produce the heatmap:

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

When I plot this data I get the number of fruit on the x-axis and people on the y-axis. I also do not get color gradients representing number of fruit. How can I get the names of the fruits on the x-axis with the number of fruit eaten by a person displayed as a heat map? The current output I am getting in R looks like this:

enter image description here


Solution

  • To be honest @dr.bunsen - your example above was poorly reproducable and you didn't read the first part of the tutorial that you linked. Here is probably what you are looking for:

     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