我正在尝试学习如何在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
非常感谢您的帮助!我想学习如何正确地做到这一点:)
答案 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")