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

ggplot2渐变比例尺图例优化:放大低密度区间及log10刻度排错

解决ggplot2渐变比例尺图例可读性问题

我用ggplot2自定义渐变比例尺可视化数据,目标是突出高密度区域(六边形包含超100个观测值时用coral2/红色显示),同时保留低密度区域的细节。初始代码如下:

set.seed(1)
library(data.table)
library(ggplot2)

d=data.table(a=c(sample(seq(1,1500,1),20000, replace=T),sample(seq(1998,2000,1),1000, replace=T),sample(seq(1,150,1),19000, replace=T)),
             b=c(sample(seq(1,2000,1),20000, replace=T),sample(seq(150,160,1),1000, replace=T),sample(seq(1100,1600,1),19000, replace=T)))
ggplot(d) + 
  aes(x = a, y = b) +
  geom_hex(bins = 70, colour = "white") + 
  scale_fill_gradientn(colours = c("white", 'yellow', 
                                    'coral2', 'red2'), 
                       values = c(0, 0.01, 0.1, 1),
                       limits=c(1,1000)) +
  theme_minimal()

但实际使用中遇到问题:图例无法清晰展示黄色、橙色对应的[0;100]低密度区间,尝试aes.override也没用;真实数据集的密度范围是0-25000个观测值/六边形,图例可读性极差。


后来尝试用log10刻度优化,结果报错Error in seq.default(min, max, by = by) : from must be a finite number,当时的代码是:

library(tidyverse)

graph=function(.x,.y,legend.x,legend.y,title) { 
d %>% ggplot() +
 aes_string(x=.x,y=.y)+ 
 geom_hex(binwidth=c(10,10)) +
 labs(x=legend.x, y=legend.y,
      title = title) +
 geom_smooth(col="black",se=F) +
 geom_function(fun = ~.x) +
 scale_fill_gradientn(colours = c("aliceblue", 'yellow', 'orange', 'coral2', 'coral3'), 
                      values = c(0, 0.2, 0.4, 0.6, 1),
                      trans = "log10",
                      limits=c(0,25000)) 
 }

删掉trans = "log10"后代码可正常运行,但未解决图例可读性问题。


最终找到正确的log10刻度配置方法,核心是将values参数基于log10转换后的比例设置,代码如下:

scale_fill_gradientn(colours = c("aliceblue", 'yellow', 'orange', 'coral2', 'coral3'), 
                     # 将目标值按最大值(25000)的log10比例缩放
                     # 这里设置:1个观测值的六边形为白色,25个为黄色,200个为橙色,2000个为coral2,25000个为coral3
                     values = c(log10(1)/log10(25000), log10(25)/log10(25000),log10(200)/log10(25000),log10(2000)/log10(25000), 1),
                     trans = "log10",
                     # 不要修改limits的数值
                     limits=c(1,25000),
                     # 如果需要自定义刻度,保持原始数值即可
                     breaks=c(1,25,200,2000,25000)
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:52:48