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

R 关于使用ggplot2制作热图的基本问题,r,ggplot2,heatmap,R,Ggplot2,Heatmap,我正在尝试学习如何在R中生成热图,如果这些问题看起来很基本,那么很抱歉。假设我有一张桌子(有点做作,但我只是想在这里练习): dput结构如下所示: 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

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

dput结构如下所示:

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

到目前为止,我有以下内容,它创建了正确的结构,但没有包含平均值(不确定放在哪里…它可能很有趣。y=平均值,但我没有将其应用于y或x,所以我不知道如何称呼它)

我还希望颜色范围从黄色到红色,基于我添加的值

+ scale_fill_gradient(low="yellow", high="red")
但这导致了这个错误,我不知道如何修复

Error: Discrete value supplied to continuous scale

非常感谢你的帮助!我想学习如何正确执行此操作:)

尝试以下基本热图:

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
这是因为你试图用你的比例填充梯度来做一个梯度。但是,您只是使用fill=as.factor(NumHours)从数值中生成了一个因子。R不能使因子变为梯度,所以如果它出错了


祝你好运

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

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

哦,我明白了。这是有道理的。谢谢你的帮助。我以前从来没有遇到过变异函数,但是有很多次我遇到过这样的例子,它们会让生活变得更简单。谢谢不客气!您可以在此处找到dplyr备忘单:
Error: Discrete value supplied to continuous scale
df <- df %>% group_by(FavePet,FaveFood) %>% mutate(AvgHours = mean(NumHours))
ggplot(df, aes(FaveFood,FavePet)) + geom_tile(aes(fill = AvgHours)) + scale_fill_gradient(low = "yellow", high = "red")