在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
相关产品推荐
相关产品推荐

