首页 > 解决方案 > 删除 stat_density_2d(geom = 'point') 中密度为 0(无数据)的点

问题描述

我有两个数据框,一个我想使用“光栅”几何图形制作 stat_density_2d 图,一个我想使用“点”几何图形。对于点几何,我想删除任何没有数据的点,以点大小为 0 来衡量。

以下是我的代码:

library(tidyverse)

set.seed(1)

#tibble for raster density plot
df <- tibble(x = runif(1000000, min = -7, max = 5),
             y = runif(1000000, min = 0, max = 1000))

#tibble for point density plot
df2 <-  tibble(x = runif(20000, min = -2, max = 2),
               y = runif(20000, min = 0, max = 500))

#create the density plot
p1 <- ggplot(NULL, aes(x=x, y=y) ) +
  stat_density_2d(data = df, aes(fill = stat(density)), geom = "raster", contour = FALSE) +
  scale_fill_gradient(low="transparent", high="red") +
  stat_density_2d(data = df2, geom = "point", aes(size = ..density..), n = 40, contour = FALSE) +
  theme_bw() +
  theme(text=element_text(size=18)) +
  ylim(0, 1000) + xlim(-7, 5)

p1

返回:

在此处输入图像描述

但是在点最小的地方(在 df2 tibble 中指定的范围之外),我不希望显示任何密度点。反正有没有删除这些?

标签: rggplot2

解决方案


这是一个 hack,虽然我不知道它对数据差异有多强大。

蓝光:添加scale_radius(range=c(-1,6))

我大量减少了您的数据,因此渲染不需要 5 分钟。

set.seed(1)
df <- tibble(x = runif(1000, min = -7, max = 5),
             y = runif(1000, min = 0, max = 1000))
df2 <-  tibble(x = runif(20, min = -2, max = 2),
               y = runif(20, min = 0, max = 500))

四个地块:

  1. 您的代码(我的数据),没有其他变化;
  2. scale_radius();
  3. scale_radius(range = c(-0.332088004, 6)); 和
  4. scale_radius(range = c(-1, 6)).

四个地块

这肯定是一个 hack,我不知道如何找到更精确的方法来过滤掉特定级别。

修改后的代码:

p1 <- ggplot(NULL, aes(x=x, y=y) ) +
  stat_density_2d(data = df, aes(fill = stat(density)), geom = "raster", contour = FALSE) +
  scale_fill_gradient(low="transparent", high="red") +
  stat_density_2d(data = df2, geom = "point", aes(size = ..density..), n = 40, contour = FALSE) +
  theme_bw() +
  # scale_radius() +
  # scale_radius(range = c(-0.332088004, 6)) +
  scale_radius(range = c(-1, 6)) +
  theme(text=element_text(size=18)) +
  ylim(0, 1000) + xlim(-7, 5)

推荐阅读