2011-12-06 61 views
13

我正在尝试使用ggplot2生成热图。我发现this example,我基本上试图复制我的数据,但我有困难。我的数据是一个简单的.csv文件看起来像这样:如何使用ggplot2生成热图?

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

我想制作一个简单的热图,其中水果的名称是在x轴和人是在y轴。图表应描绘出每个方块的颜色代表所消耗水果数量的方块。与mike:peach对应的正方形应该是最黑的。

这里是我使用的尝试生产热图的代码:

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

当我绘制这个数据,我得到的x轴和人民在y轴水果的数量。我也没有得到代表水果数量的颜色渐变。我怎样才能得到X轴水果的名称与一个人所吃水果的数量显示为热图? 电流输出,我R中得到如下:

enter image description here

回答

30

说实话@ dr.bunsen - 你上面的例子是不好可再现的,你没有读过本教程的第一部分,你linked。这可能是你在找什么:

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我试图运行上面的原始问题的数据的代码,但它失败:错误的重新调整(值):使用:rescale(x,newrange)其中x是数字对象,newrange是新的最小值和最大值。有什么问题? – Ali

+1

@AliSharifi是的,你是对的 - 在'ggplot2'和其他包中删除'recale'函数或将它移到其他函数中必须有一些变化。你需要的是使用scale'包中的'rescale'来重新调整数值向量以指定最小值和最大值。我更新了代码以完全重现。 –

+0

@GeekOnAcid完美! – Ali