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

ggplot2中scale_fill_gradientn图例消失及自定义色阶问题

解决p-adj值热图的对数刻度色阶与统一图例问题

需求说明

绘制ANOVA+Tukey检验得到的p-adj值热图,要求:

  • p-adj值范围覆盖1到1e-9,采用对数刻度的连续颜色渐变
  • 将0.05设为lightcoral(小p值)与royalblue(大p值)之间的白色中点
  • 手动设置图例断点和标签,且多张图的色阶与图例保持统一(不随单图数据自动调整)

问题分析

  • 初始代码未做对数转换,直接使用原始值设置values和breaks,导致图例失效
  • 添加trans="log10"后,默认色阶随单图数据范围变化,且无法自定义颜色中点、断点和标签

解决方案代码

library(ggplot2)
library(scales)

# 测试数据集
var1 <- c("BB", "BB", "BB", "H", "H", "H", "ML", "ML", "ML")
var2 <- c("Fraction 5", "Fraction 6", "Fraction 7", 
          "Fraction 5", "Fraction 6", "Fraction 7", 
          "Fraction 5", "Fraction 6", "Fraction 7")
value <- c(2.172310e-01, 4.002828e-04, 1.336477e-03, 
           5.120373e-06, 9.429461e-07, 6.303150e-08, 
           1.000000e+00, 2.066473e-01, 5.715313e-01)
df <- data.frame(var1, var2, value)

# 生成符合要求的热图
ggplot(data = df, aes(var1, var2, fill = value)) +
  geom_tile(color = "white") +
  # 核心色阶设置:对数转换+固定范围+自定义颜色节点
  scale_fill_gradientn(
    colors = c("lightcoral", "white", "royalblue"),
    trans = "log10",
    limits = c(1e-9, 1),          # 固定色阶范围,确保多图统一
    values = rescale(log10(c(1e-9, 0.05, 1))),  # 将0.05设为颜色中点
    breaks = c(1e-9, 1e-6, 1e-3, 0.05, 0.5, 1), # 手动指定图例断点
    labels = c("1e-9", "1e-6", "0.001", "0.05", "0.5", "1") # 对应断点标签
  ) +
  # 图例样式调整
  guides(fill = guide_colorbar(
    title = "p adj",
    title.position = "top",
    barwidth = 15,
    barheight = 1
  )) +
  # 坐标轴标题设置
  labs(x = "Total", y = "Fractions") +
  # 修正x轴标签映射(原代码存在顺序错误)
  scale_x_discrete(labels = c("BB" = "BB", "H" = "H", "ML" = "ML")) +
  # 主题样式优化
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, vjust = 1, size = 10, hjust = 1),
    axis.title.x = element_text(size = 12),
    axis.title.y = element_text(size = 12),
    legend.title = element_text(size = 12),
    legend.text = element_text(size = 10)
  ) +
  coord_fixed()

关键设置解释

  1. 固定色阶范围:limits = c(1e-9, 1)强制色阶覆盖所有可能的p-adj值,多张图复用此参数即可保证色阶完全统一,不受单图数据范围影响。
  2. 自定义颜色中点:通过log10()将p-adj值转换为对数刻度后,用rescale()映射到0-1区间,确保0.05正好对应白色的位置。
  3. 手动图例控制:breaks和labels参数直接指定需要显示的断点和标签,避免默认图例的自动调整。
  4. 修正坐标轴标签:原代码中scale_x_discrete的标签顺序与var1的水平不匹配,调整后保证标签与类别对应正确。

内容的提问来源于stack exchange,提问作者Sébastien de la Forest Divonne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:15:18