ggplot2中stat_density_2d(raster)如何分区域填充不同渐变颜色?
这问题挺有意思的——要给2D密度图按x轴区间分不同的填充渐变,默认ggplot的单一fill比例尺确实搞不定,不过用ggnewscale包就能轻松解决!我给你拆解下步骤和代码:
解决思路
核心问题是ggplot默认只能绑定一个fill比例尺,所以我们需要用多比例尺切换的方式,分别绘制两个x区间的密度栅格,各自绑定对应的渐变填充。这里用到ggnewscale包来实现多fill比例尺的独立配置。
具体实现步骤
- 安装并加载必要的包:如果还没装
ggnewscale,先完成安装:
install.packages("ggnewscale") library(ggnewscale) library(ggplot2)
- 修改代码,分区域绘制密度栅格:
- 先处理x ∈ [-100, 0]的区域,设置白到红的渐变;
- 用
new_scale_fill()切换到新的填充比例尺; - 再处理x ∈ [0, 100]的区域,设置你想要的其他渐变(比如保留你原来的白到蓝);
- 最后叠加散点和调整坐标轴范围。
完整代码如下:
library(ggplot2) library(ggnewscale) # 假设你的data已经包含xVal和yVal列 d <- ggplot(data, aes(xVal, yVal)) + # 左半区:x从-100到0,白到红渐变 stat_density_2d(geom = "raster", aes(fill = ..density..), contour = FALSE, # 仅筛选x<=0的数据计算密度 data = ~ subset(., xVal <= 0)) + scale_fill_gradient2(low = "white", high = "red", space = "Lab", limits = c(0.00000, 0.00008), guide = "colourbar", name = "Left Density") + # 切换到新的填充比例尺 new_scale_fill() + # 右半区:x从0到100,保留你原来的白到蓝渐变 stat_density_2d(geom = "raster", aes(fill = ..density..), contour = FALSE, # 仅筛选x>=0的数据计算密度 data = ~ subset(., xVal >= 0)) + scale_fill_gradient2(low = "white", high = "#1A6AFF", space = "Lab", limits = c(0.00000, 0.00008), guide = "colourbar", name = "Right Density") + # 叠加散点并设置x轴范围 geom_point() + xlim(-100, 100) d
关键细节说明
- 每个
stat_density_2d都通过data = ~ subset(., xVal <= 0)限定了计算密度的区域,确保各自只处理对应x区间的数据,不会互相干扰; new_scale_fill()是核心,它告诉ggplot接下来要使用全新的fill比例尺,不会和之前的配置冲突;- 你可以根据需求自由调整两个渐变的颜色、数值范围(
limits)等参数,比如右半区想换成绿到黄的渐变,直接修改high参数即可; - 如果觉得两个色条太占空间,可以通过
guide = guide_colourbar()的子参数(比如width、height)调整尺寸,或者根据需求合并成一个(不过分区域展示的话,分开色条会更清晰)。
内容的提问来源于stack exchange,提问作者Union find
相关产品推荐
相关产品推荐

