【问题标题】:Heat map with additional values in RR中带有附加值的热图
【发布时间】:2019-10-23 04:37:20
【问题描述】:

我为样本数据创建了一个热图。我想添加一些关于每小时平均值和一周中每一天总和的信息。最好在图表的右侧增加一列,在顶部增加一行,不填充。

我的代码如下所示:

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

【问题讨论】:

    标签: r dataframe ggplot2 heatmap


    【解决方案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)
    

    【讨论】:

    • 不填可以取平均值吗?
    • 您的意思是通过“填充”将颜色填充到图块中吗?
    • 是的,我更喜欢不填avg。
    • 现在还没有想到。我不确定在geom_tile() 内是否可行。
    • 哦,这很好。谢谢你分享。如果可能,我稍后会研究并编辑。
    猜你喜欢
    • 2021-08-13
    • 2023-04-07
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    相关资源
    最近更新 更多