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

在ggplot2(R语言)中调整色条图例的显示范围

问题描述
  • 需求:展示Observation变量随时间的变化趋势,使用指定配色为数据点着色;希望仅限制色条图例的显示区间(如-10到100),提升小值区间的颜色区分度,同时不改变原有数据点的颜色映射规则。
  • 当前问题:代码可正常运行,但色条图例因包含0-1000的大范围,小值区域颜色区分度极低,视觉效果差。
  • 用户原代码:
# 定义颜色刻度
colors <- c("black", "grey", "darkred", "red", "tomato", "white", "white",
            "lightgreen", "green", "darkgreen", "darkolivegreen", 
            "cyan", "blue", "darkblue", "midnightblue", "purple", 
            "magenta", "darkmagenta", "yellow", "gold4")
values <- c(-10, -5, -3, -1.5, -0.001, 0, 0.001, 4, 6, 8, 10, 15, 20, 40, 60, 80, 100, 200, 500, 1000)

# 绘图
ggplot(notes2023, aes(x = Date, y = Observations)) +
  geom_point(aes(colour = Observations), size = 1) +
  scale_color_gradientn(colours = colors, values = scales::rescale(values), limits = c(-10, 1000),
                        oob = scales::squish, name = 'Indice', 
                        guide = guide_colorbar(direction = "vertical", barwidth = 1, barheight = 10, limits = c(-10, 100), title.position = "top")) +
  geom_smooth(color = "black", span = 0.2, size = 0.5) +
  scale_y_continuous(trans = pseudolog10_trans, breaks = c(-5, 0, 5, 10, 20, 50, 100, 1000)) +
  labs(title = "Observations journalières", subtitle = "2023", x = "Date", y = "Observation") +
  theme_clean(base_size = 5) +
  theme(legend.title.align = 0.5, legend.text = element_text(size = 6))
  • 当前图表效果:色条大部分区域被高值(100-1000)占据,-10到100区间的颜色压缩在极小范围内,无法清晰区分小值对应的颜色。
解决方案

核心思路:保持数据点的颜色映射规则(基于-10到1000的范围)不变,仅通过guide_colorbar的参数调整色条的显示区间、刻度密度,提升小值区域的视觉区分度。

修改后的代码:

# 定义颜色刻度
colors <- c("black", "grey", "darkred", "red", "tomato", "white", "white",
            "lightgreen", "green", "darkgreen", "darkolivegreen", 
            "cyan", "blue", "darkblue", "midnightblue", "purple", 
            "magenta", "darkmagenta", "yellow", "gold4")
values <- c(-10, -5, -3, -1.5, -0.001, 0, 0.001, 4, 6, 8, 10, 15, 20, 40, 60, 80, 100, 200, 500, 1000)

# 绘图
ggplot(notes2023, aes(x = Date, y = Observations)) +
  geom_point(aes(colour = Observations), size = 1) +
  scale_color_gradientn(
    colours = colors, 
    values = scales::rescale(values), 
    limits = c(-10, 1000),  # 保持原有颜色映射范围
    oob = scales::squish,    # 超出范围的值压缩到边界颜色
    name = 'Indice', 
    guide = guide_colorbar(
      direction = "vertical", 
      barwidth = 1, 
      barheight = 10, 
      limits = c(-10, 100),  # 色条仅显示-10到100区间
      breaks = c(-10, -5, -3, -1.5, 0, 4, 6, 8, 10, 15, 20, 40, 60, 80, 100),  # 增加小值刻度,提升区分度
      labels = c(-10, -5, -3, -1.5, 0, 4, 6, 8, 10, 15, 20, 40, 60, 80, "≥100"),  # 标注高值压缩提示
      title.position = "top"
    )
  ) +
  geom_smooth(color = "black", span = 0.2, size = 0.5) +
  scale_y_continuous(trans = pseudolog10_trans, breaks = c(-5, 0, 5, 10, 20, 50, 100, 1000)) +
  labs(title = "Observations journalières", subtitle = "2023", x = "Date", y = "Observation") +
  theme_clean(base_size = 5) +
  theme(legend.title.align = 0.5, legend.text = element_text(size = 6))
关键改动说明
  • 保留scale_color_gradientn的limits = c(-10, 1000)和oob = scales::squish,确保数据点的颜色映射规则不变(≥100的点统一使用gold4颜色)。
  • 在guide_colorbar中:
    • 设置limits = c(-10, 100),让色条仅展示小值区间。
    • 增加breaks参数,添加更多小值刻度,让颜色变化更清晰。
    • 修改labels,将100标注为≥100,直观提示用户高值已被压缩到该颜色。

内容的提问来源于Stack Exchange,提问作者Constantin Marguier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 21:09:50