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

