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

如何在ggplot2中实现对称配色映射但仅显示实际观测值的色条?

实现对称配色+仅显示实际范围的色条

要同时满足「对称颜色映射(0对应白色)」和「色条只展示实际观测数值范围」,可以通过分离颜色映射的逻辑值域与色条的显示范围来实现,具体调整如下:

核心思路

  • 颜色映射仍基于以0为中点的对称值域(取数据的最大绝对值作为正负边界),确保正负对称数值(如0.4和-0.4)颜色完全一致。
  • 色条的显示范围单独通过guide_colorbar的frame.limits参数控制,只展示实际数据的最小和最大值,而非完整对称区间。

修改后的完整代码

library(ggplot2)

df <- expand.grid(
  x = c(1, 2, 3),
  y = c(1, 2, 3),
  g = c("one", "two")
)

one <- c(1.90, 1.40, 1.10, 0.90, 0.80, 0.50, 0.40, 0.30, 0.20)
two <- c(1.90, 1.40, 1.10, 0.90, 0.80, -0.50, -0.40, -0.30, -0.20)
df$v <- c(one, two)

min_value <- min(df$v)
max_value <- max(df$v)
abs_max <- max(abs(df$v))  # 取数据的最大绝对值,用于定义对称颜色边界
midpoint <- 0

ggplot(df, aes(x = x, y = y, fill = v)) +
  facet_wrap(. ~ g, ncol = 2) +
  geom_tile(color = "black") +
  geom_text(aes(label = round(v, 2)), color = "red") +
  scale_y_discrete(expand = c(0,0)) +
  scale_x_discrete(expand = c(0,0)) +
  scale_fill_gradientn(
    colors = c(hcl.colors(5, "Inferno")[1:5], "white", hcl.colors(5, "Inferno")[5:1]),
    limits = c(-abs_max, abs_max),  # 颜色映射基于对称值域,保证颜色对称
    breaks = c(min_value, max_value),  # 刻度显示实际数据的极值
    labels = c(round(min_value,2), round(max_value,2))
  ) +
  guides(
    fill = guide_colorbar(
      barheight = unit(5, "cm"),
      ticks.colour = "black",
      ticks.linewidth = 0.5,
      frame.colour = "black",
      frame.linewidth = 0.5,
      frame.limits = c(min_value, max_value)  # 色条框架仅显示实际观测范围
    ))

效果说明

  • 颜色映射:所有数值都基于-1.9到1.9的对称区间映射,所以0.4和-0.4会对应完全对称的颜色。
  • 色条显示:色条的框架只展示实际数据的范围(比如"one"组的色条显示0.2到1.9,"two"组显示-0.5到1.9),同时刻度和颜色渐变完全匹配实际观测值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 22:46:00