You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:50:22