我尝试使用函数stat_density_2d在R中绘制密度图,但我想删除密度为空的背景颜色。我尝试更改密度的限制,但当将限制从[0,5]移动到[0.1,5]时,背景变为灰色而不是深蓝色。我该怎么做才能有一个透明的背景,并且只为数据点着色?
下面是我的代码:
ggplot(TEST, aes(x = X, y = Y)) +
geom_point() +
stat_density_2d(geom = "raster", aes(fill = ..density..*10e04), contour = F,
h = c(5, 5),
n = 300) +
ggtitle("7387")+
theme(plot.title = element_text(lineheight=.8, face="bold"))+
scale_y_reverse()+
scale_fill_distiller(palette = 'Spectral', limits=c(0,5))
谢谢大家!
3条答案
按热度按时间70gysomp1#
可以将密度Map到Alpha比例,以便较低的值是透明的:
kx7yvsdv2#
基于已接受的答案--设置限制时背景变为灰色,因为超出限制的坐标将接收值
NA
,而NA
的默认填充为"grey50"
。要使用其他颜色,请指定na.value
。要移除背景,请将下限设置为接近0的某个值,然后使用"transparent"
由reprex package(v2.0.1)于2022年5月22日创建
ncgqoxb03#
在此,我想提出另一种可能的解决方案。以前的解决方案要么要求您使用alpha尺度,要么要求您硬编码一些与数据范围相关的值。如果您真的只希望低值透明,而不希望中/高值透明,则很难正确使用alpha尺度。如果您要制作多个图表或使用不同的输入,则硬编码会有问题(例如,.01的下限在一个数据集上可能看起来不错,但在另一个数据集上截断了重要值)。
解决方案是创建一个以
'transparent'
开头的自定义颜色Map表。您可以使用现有的色带(如viridis)来完成此操作。调用
viridis::viridis_pal()(n)
会给予你一个来自草绿色的颜色矢量,你也可以用viridis::viridis_pal(option='magma')(10)
这样的函数访问其他函数,它会给你10种来自岩浆调色板的颜色。要创建新的色带,请使用
scale_fill_gradientn()
并在所需比例的颜色范围前串联'transparent'
:现在你有了一个在范围的最小端是透明的比例,但是随后通过绿色渐变。你也可以根据需要在这里选择你自己的颜色,而不是依赖于内置的比例。
您还可以通过调整用于构建渐变的颜色数量来减弱这种效果。这种效果很微妙,但颜色越多意味着填充的“背景”越多,而颜色越少则会让更多的背景逐渐消失。
viridis::viridis_pal()(5)
和viridis::viridis_pal()(30)
比较如下:这种效果与数据的缩放无关--如果将密度乘以10,结果将是相同的(如果使用基于硬编码限制的方法,结果将不是相同的)。