R 中具有附加值的热图

Heat map with additional values in R

我为示例数据创建了热图。我想添加一些有关每小时平均值和一周中每一天总和的信息。最好右边多一列,图表顶部多一列,不填。

我的代码如下所示:

TD=data.frame(wday=rep(c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", 
                         "Saturday"),24), hour=rep(0:23, each=7), N=sample(100:300, 168))

ggplot(TD, aes(hour, wday,  fill=N)) + 
  geom_tile(colour = "white", na.rm = TRUE) +
  theme_bw() + theme_minimal() + 
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
  scale_fill_viridis() +
  coord_fixed(xlim = c(0, 23)) +
  geom_text(aes(label=paste(N)), size=4) + 
  scale_x_continuous(breaks=seq(0, 23, 1)) 

对我来说最明显的解决方案是将这些方法包含在您的数据框中,然后绘制您的热图。

library("ggplot2")
library("dplyr")
library("tidyr")
library("viridis")

TD=data.frame(wday=rep(c("Sunday", "Monday", "Tuesday", 
              "Wednesday", "Thursday", "Friday", "Saturday"),24),
              hour=rep(0:23, each=7), 
              N=sample(100:300, 168))

df <- TD %>% group_by(wday) %>% summarise(N=round(mean(N)), hour="avg") %>% rbind(TD)
df <- TD %>% group_by(hour) %>% summarise(N=round(mean(N)), wday="avg") %>% rbind(df)

df$wday <- factor(df$wday, levels=c("Monday", "Tuesday", "Wednesday", "Thursday",
                  "Friday", "Saturday", "Sunday", "avg"))
df$hour <- factor(df$hour, levels=c(as.character(0:23), "avg"))

ggplot(df, aes(hour, wday, fill=N)) + 
  geom_tile(colour="white", na.rm=TRUE) +
  theme_bw() + 
  theme_minimal() + 
  theme(panel.grid.major=element_blank(), panel.grid.minor=element_blank()) +
  scale_fill_viridis() +
  coord_fixed(xlim = c(0, 23)) +
  geom_text(aes(label=paste(N)), size=4) + 
  coord_fixed(xlim=c(0, 25), ratio=1)

编辑 : 不填写新元素。

df <- TD %>% group_by(hour) %>% summarise(N=round(mean(N)), wday="avg") %>% rbind(TD)
df <- df %>% group_by(wday) %>% summarise(N=round(sum(N)), hour="sum") %>% rbind(df)

df$wday <- factor(df$wday, levels=c("Monday", "Tuesday", "Wednesday", "Thursday",
                                    "Friday", "Saturday", "Sunday", "avg"))
df$hour <- factor(df$hour, levels=c(as.character(0:23), "sum"))

ggplot() + 
  geom_tile(colour="white", data=subset(df, hour!="sum" & wday!="avg"), 
            aes(hour, wday, fill=N)) +
  geom_text(aes(hour, wday, label=N), data=df, inherit.aes=FALSE) +
  scale_x_discrete(limits=levels(df$hour)) +
  scale_y_discrete(limits=levels(df$wday)) +
  theme_bw() +  
  theme_minimal() + 
  theme(panel.grid.major=element_blank(), panel.grid.minor=element_blank(),
        axis.title=element_blank()) +
  scale_fill_viridis() +
  coord_fixed(xlim=c(0, 25), ratio=1)