如何在ggplot热力图中排除总计行的颜色渐变并自动生成总计行
解决方案:自动生成总计行 + 控制热力图颜色渐变
1. 自动生成总计行(替代繁琐的手动计算)
用dplyr的分组汇总功能可以快速生成星期总计、小时总计和全局总计,完全替代numcolwise或sumifs这类手动计算方法。假设你的原始数据是包含weekday(星期)、hour(小时)、call_count(呼叫次数)的数据框:
示例代码:
library(dplyr) library(ggplot2) # 模拟原始数据(替换成你的真实数据) call_data <- tibble( weekday = rep(c("周一", "周二", "周三", "周四", "周五", "周六", "周日"), each = 24), hour = rep(0:23, 7), call_count = sample(10:100, 7*24, replace = TRUE) ) # 生成各类总计行并合并到原始数据 total_data <- call_data %>% # 1. 每个星期的小时总计 group_by(weekday) %>% summarise(hour = "总计", call_count = sum(call_count), .groups = "drop") %>% # 2. 每个小时的星期总计 bind_rows( call_data %>% group_by(hour) %>% summarise(weekday = "总计", call_count = sum(call_count), .groups = "drop") %>% mutate(hour = as.character(hour)) ) %>% # 3. 全局总计 bind_rows(tibble(weekday = "总计", hour = "总计", call_count = sum(call_data$call_count))) %>% # 合并原始数据并调整顺序(让"总计"排在最后) bind_rows(call_data %>% mutate(hour = as.character(hour))) %>% mutate( weekday = factor(weekday, levels = c("周一", "周二", "周三", "周四", "周五", "周六", "周日", "总计")), hour = factor(hour, levels = c(as.character(0:23), "总计")) )
2. 解决总计行颜色渐变问题
根据需求选择以下两种方案:
方案1:总计行用固定颜色(不参与主数据渐变)
将主数据和总计行分层绘制,主数据用渐变填充,总计行用灰色等固定颜色区分:
ggplot() + # 绘制主数据热力图 geom_tile( data = total_data %>% filter(weekday != "总计", hour != "总计"), aes(x = hour, y = weekday, fill = call_count), color = "white" ) + # 绘制总计行/列(固定填充色) geom_tile( data = total_data %>% filter(weekday == "总计" | hour == "总计"), aes(x = hour, y = weekday), fill = "#cccccc", color = "white" ) + # 主数据的颜色渐变配置 scale_fill_gradient(low = "#f7fbff", high = "#08306b") + labs(x = "小时", y = "星期", fill = "呼叫次数") + theme_minimal()
方案2:总计行参与渐变但不压缩主数据颜色范围
如果希望总计行也用渐变,但避免大数值的总计压缩主数据的颜色区分度,可以限定主数据的颜色范围,超出部分用边界色固定:
# 获取主数据的呼叫次数范围 main_call_range <- range(total_data$call_count[total_data$weekday != "总计" & total_data$hour != "总计"]) ggplot(total_data, aes(x = hour, y = weekday, fill = call_count)) + geom_tile(color = "white") + scale_fill_gradient( low = "#f7fbff", high = "#08306b", limits = main_call_range, oob = scales::squish # 超出范围的数值用边界色填充 ) + labs(x = "小时", y = "星期", fill = "呼叫次数") + theme_minimal()
内容的提问来源于stack exchange,提问作者Abby
相关产品推荐
相关产品推荐

