关于使用ggplot2制作热图的基本问题

时间:2015-04-07 03:08:14

标签: r ggplot2 heatmap

我正在尝试学习如何在R中生成热图,所以如果这些问题看起来非常基本,那就很抱歉。假设我有这张桌子(有点做作,但我只是想在这里练习):

    NumHours FavePet FaveFood
1        3     Cat    Burger
2        2     Cat    Pizza
3        5    Fish    Pizza
4        2     Dog    Pizza
5        4    Fish    Apple
6        3     Dog    Burger
7        3     Cat    Pizza
8        1     Cat    Burger
9        6     Dog    Apple

输入结构如下:

structure(list(NumHours = c(3L, 2L, 5L,2L, 4L, 3L, 3L, 1L, 6L), 
FavePet = structure(c(2L, 2L, 3L, 1L, 3L, 1L, 2L, 2L, 1L), 
.Label = c("Dog",  "Cat", "Fish"), class = "factor"), 
FaveFood = structure(c(3L, 2L, 2L, 2L, 1L, 3L, 2L, 3L, 1L), 
.Label = c("Apple", "Pizza", "Burger"), class = "factor")), 
.Names = c("NumHours", "FavePet", "FaveFood"), row.names = c(NA, 9L), class = "data.frame")

我想生成一个热图,其中FaveFood位于x轴上,FavePet位于y轴上,该对的平均小时数是颜色的强度。例如,由于有两个“Cat Pizza”值(2,3),因此将绘制对应于2.5的颜色,这将比Dog Apple的值更轻,其值为6.

到目前为止,我有以下内容,它创建了正确的结构,但没有包含平均值(不知道放在哪里......它可能就像fun.y = mean,但我不是应用它到y或x,所以我不知道怎么称呼它)。

ggplot(df, aes(x=FaveFood, y=FavePet, fill=as.factor(NumHours))) + geom_tile(aes(color="white"))

我也喜欢颜色从黄色到红色,基于值,所以我添加了

+ scale_fill_gradient(low="yellow", high="red")

但这导致了这个错误,我不知道如何解决。

Error: Discrete value supplied to continuous scale

非常感谢您的帮助!我想学习如何正确地做到这一点:)

2 个答案:

答案 0 :(得分:1)

尝试一下基本的热图:

ggplot(df, aes(FaveFood, FavePet)) + 
  geom_tile(aes(fill = NumHours),  colour = "black") + 
  scale_fill_gradient(name = "NumHours", low = "yellow",  high = "red") +
  labs(title = "Heatmap FaveFood and FavePet")+
  labs(x = "FaveFood", y = "FavePet")

有一个原因导致错误:

Error: Discrete value supplied to continuous scale

这是因为您尝试使用scale_fill_gradient创建渐变。但是,您只使用fill = as.factor(NumHours)从数值中选择了一个因子。 R不能从一个因子中产生一个梯度,因此它出错了。

祝你好运!

答案 1 :(得分:0)

首先,您可以使用mutate内的dplyr函数生成一个名为AvgHours的新变量,该变量计算FavePet和FaveFood对的平均值。

df <- df %>% group_by(FavePet,FaveFood) %>% mutate(AvgHours = mean(NumHours))

然后你可以使用ggplot&#39; s geom_tile绘制所需的热图。

ggplot(df, aes(FaveFood,FavePet)) + geom_tile(aes(fill = AvgHours)) + scale_fill_gradient(low = "yellow", high = "red")