R语言 如何删除stat_density_2d中的背景?

mgdq6dx1  于 2023-02-06  发布在  其他
关注(0)|答案(3)|浏览(164)

我尝试使用函数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))

谢谢大家!

70gysomp

70gysomp1#

可以将密度Map到Alpha比例,以便较低的值是透明的:

TEST <- data.frame(X = rnorm(10000, -700, 50),
                   Y = rnorm(10000, -450, 50))

ggplot(TEST, aes(x = X, y = Y)) +
  stat_density_2d(geom = "raster", 
                  aes(fill = ..density..*10e04, alpha = ..density..*10e04), 
                  contour = FALSE, 
                  h = c(7, 7),
                  n = 300) +
  scale_alpha_continuous(range = c(0, 1), limits = c(0, 3), 
                         guide = guide_none()) +
  ggtitle("7387") + 
  theme(plot.title = element_text(lineheight=.8, face="bold"))+
  scale_y_reverse() +
  scale_fill_viridis_c(limits = c(0, 12))

kx7yvsdv

kx7yvsdv2#

基于已接受的答案--设置限制时背景变为灰色,因为超出限制的坐标将接收值NA,而NA的默认填充为"grey50"。要使用其他颜色,请指定na.value。要移除背景,请将下限设置为接近0的某个值,然后使用"transparent"

library(ggplot2)

TEST <- data.frame(X = rnorm(10000, -700, 50),
                   Y = rnorm(10000, -450, 50))

ggplot(TEST, aes(x = X, y = Y)) +
  stat_density_2d(geom = "raster", 
                  aes(fill = ..density..*10e04), 
                  contour = FALSE, 
                  h = c(7, 7),
                  n = 300) +
  ggtitle("7387") + 
  theme(plot.title = element_text(lineheight=.8, face="bold"))+
  scale_y_reverse() +
  scale_fill_viridis_c(limits = c(0.001, 12), na.value = "transparent")

reprex package(v2.0.1)于2022年5月22日创建

ncgqoxb0

ncgqoxb03#

在此,我想提出另一种可能的解决方案。以前的解决方案要么要求您使用alpha尺度,要么要求您硬编码一些与数据范围相关的值。如果您真的只希望低值透明,而不希望中/高值透明,则很难正确使用alpha尺度。如果您要制作多个图表或使用不同的输入,则硬编码会有问题(例如,.01的下限在一个数据集上可能看起来不错,但在另一个数据集上截断了重要值)。
解决方案是创建一个以'transparent'开头的自定义颜色Map表。您可以使用现有的色带(如viridis)来完成此操作。
调用viridis::viridis_pal()(n)会给予你一个来自草绿色的颜色矢量,你也可以用viridis::viridis_pal(option='magma')(10)这样的函数访问其他函数,它会给你10种来自岩浆调色板的颜色。
要创建新的色带,请使用scale_fill_gradientn()并在所需比例的颜色范围前串联'transparent'

scale_fill_gradientn(colors = c('transparent',viridis::viridis_pal()(10)))

现在你有了一个在范围的最小端是透明的比例,但是随后通过绿色渐变。你也可以根据需要在这里选择你自己的颜色,而不是依赖于内置的比例。

TEST <- data.frame(X = rnorm(10000, -700, 50),
                   Y = rnorm(10000, -450, 50))

ggplot(TEST, aes(x = X, y = Y)) +
  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_gradientn(colors = c('transparent',viridis::viridis_pal()(10)))

您还可以通过调整用于构建渐变的颜色数量来减弱这种效果。这种效果很微妙,但颜色越多意味着填充的“背景”越多,而颜色越少则会让更多的背景逐渐消失。viridis::viridis_pal()(5)viridis::viridis_pal()(30)比较如下:

这种效果与数据的缩放无关--如果将密度乘以10,结果将是相同的(如果使用基于硬编码限制的方法,结果将不是相同的)。

相关问题