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

如何在R的ggplot2中为热图各列设置独立渐变配色

问题

使用ggplot2绘制热图时,需为每个变量列设置独立渐变配色,避免数值范围差异大的列(如Total)掩盖其他列的数据分布。已将宽格式数据转换为包含Species、variable、value的长格式melted_data,但现有代码为所有列使用同一渐变配色,无法满足需求。


解决方案

核心思路是按变量归一化数值+使用ggnewscale实现多组填充比例尺,具体步骤如下:

1. 加载所需包

library(reshape2)
library(ggplot2)
library(ggnewscale)
library(dplyr) # 用于分组归一化

2. 数据预处理:按变量归一化数值

将每个变量的数值缩放到0-1区间,确保每个变量的渐变能充分展示自身数据分布:

# 转换为长格式(如果还没处理)
melted_data <- melt(data, id.vars = "Species")
melted_data$Species <- gsub("_", " ", melted_data$Species)

# 按variable分组,对value进行0-1归一化
melted_data <- melted_data %>%
  group_by(variable) %>%
  mutate(norm_value = scales::rescale(value, to = c(0, 1))) %>%
  ungroup()

3. 定义各变量的独立渐变配色

可以根据需求自定义每个变量的渐变色彩:

# 为每个变量定义独特的渐变配色
total_cols <- scales::gradient_n_pal(c("#f7fbff", "#2171b5"))(seq(0, 1, length.out = 10))
lse_cols <- scales::gradient_n_pal(c("#fff5f0", "#e34a33"))(seq(0, 1, length.out = 10))
ortholog_cols <- scales::gradient_n_pal(c("#f0f9e8", "#7fbc41"))(seq(0, 1, length.out = 10))
truncated_cols <- scales::gradient_n_pal(c("#fef0d9", "#d95f0e"))(seq(0, 1, length.out = 10))
pseudogenes_cols <- scales::gradient_n_pal(c("#fde0dd", "#c51b8a"))(seq(0, 1, length.out = 10))

4. 绘制带独立渐变的热图

使用new_scale_fill()切换填充比例尺,为每个变量列单独设置渐变:

ggplot() +
  # Total列
  geom_tile(data = subset(melted_data, variable == "Total"),
            aes(x = variable, y = Species, fill = norm_value), color = "white") +
  geom_text(data = subset(melted_data, variable == "Total"),
            aes(x = variable, y = Species, label = value), color = "black", size = 3) +
  scale_fill_gradientn(colors = total_cols, name = "Total", na.value = "white") +
  
  # 切换新的填充比例尺
  new_scale_fill() +
  # LSE列
  geom_tile(data = subset(melted_data, variable == "LSE"),
            aes(x = variable, y = Species, fill = norm_value), color = "white") +
  geom_text(data = subset(melted_data, variable == "LSE"),
            aes(x = variable, y = Species, label = value), color = "black", size = 3) +
  scale_fill_gradientn(colors = lse_cols, name = "LSE", na.value = "white") +
  
  new_scale_fill() +
  # Ortholog列
  geom_tile(data = subset(melted_data, variable == "Ortholog"),
            aes(x = variable, y = Species, fill = norm_value), color = "white") +
  geom_text(data = subset(melted_data, variable == "Ortholog"),
            aes(x = variable, y = Species, label = value), color = "black", size = 3) +
  scale_fill_gradientn(colors = ortholog_cols, name = "Ortholog", na.value = "white") +
  
  new_scale_fill() +
  # Truncated列
  geom_tile(data = subset(melted_data, variable == "Truncated"),
            aes(x = variable, y = Species, fill = norm_value), color = "white") +
  geom_text(data = subset(melted_data, variable == "Truncated"),
            aes(x = variable, y = Species, label = value), color = "black", size = 3) +
  scale_fill_gradientn(colors = truncated_cols, name = "Truncated", na.value = "white") +
  
  new_scale_fill() +
  # Pseudogenes列
  geom_tile(data = subset(melted_data, variable == "Pseudogenes"),
            aes(x = variable, y = Species, fill = norm_value), color = "white") +
  geom_text(data = subset(melted_data, variable == "Pseudogenes"),
            aes(x = variable, y = Species, label = value), color = "black", size = 3) +
  scale_fill_gradientn(colors = pseudogenes_cols, name = "Pseudogenes", na.value = "white") +
  
  # 主题与标签设置
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        axis.text.y = element_text(size = 7),
        legend.position = "right") +
  labs(x = "变量", y = "物种") +
  coord_fixed(ratio = 1)

关键说明

  • 归一化:scales::rescale()将每个变量的数值映射到0-1区间,保证每个变量的渐变能完整展示自身的数值差异,不会被大数值列压制
  • ggnewscale:解决ggplot2默认只能有一组填充比例尺的限制,允许为不同变量列添加独立的渐变配色
  • 独立图层:每个变量列单独绘制geom_tile()和geom_text(),配合对应的渐变比例尺,实现列级独立配色

内容的提问来源于stack exchange,提问作者Rohan Nath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:26:11