R语言 如何设置ggplot2散点图中的点大小以匹配坐标轴的比例?

ctrmrzij  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(435)

我尝试使用ggplot2制作散点图,其中点的直径与轴上的变量具有相同的维度,并且应该具有相同的比例。这个问题在this questionthis one中都得到了很好的解决,这是通过在图形上绘制椭圆来解决的(现在使用geom_circleggforce开始)。然而,对于我的应用程序,我需要绘制数千个点,使用geom_point速度很快,但使用geom_circle非常慢。是否有办法将geom_point缩放到轴的比例?
作为该问题的一个示例,下图显示了使用scale_radius时比例的差异:

x <- runif(20, 0, 20)
y <- runif(20, 0, 20)
radius <- runif(20, 0, 4)
df <- data.frame(x = x, y = y, size = radius)

library(ggplot2)

p <- ggplot(
    data = df,
    mapping = aes(
      x = x,
      y = y,
      size = radius
    )
  ) + 
  geom_point() + 
  coord_fixed() + xlim(0, 20) + ylim(0, 20) + 
  scale_radius(range = c(min(radius), max(radius)))

p

我试过使用scale_radiusscale_continuous,但是两者都使用相对于轴标度而言任意的标度(scale_radius也不会缩放,这样大小为0的点就会显示大小为0)。我有了使用ggplot_build访问绘图大小并相应地缩放点大小的想法。我可以使用ggplot_buil(p)$layout$get_scales(i=1)layer_scales(p)访问绘图范围,但没有变量与scale_radius使用的单位中的绘图大小相对应。

lhcgjxsq

lhcgjxsq1#

使用2000个圆和最大半径1(即最大直径2),我得到了~5- 7倍的加速比使用较低的多边形分辨率每圆。你也可以看看你的输出设备,并尝试ragg,这是比cairo更快,仍然提供良好的抗锯齿。

ggplot(df, aes(x0 = x, y0 = y, r = radius)) +
  ggforce::geom_circle(n = 20) + #5-7x faster than default
  coord_fixed()

看起来还是很不错的,在我的系统上有1.5秒的渲染时间。

(You也可以考虑使用coord_fixed(xlim = c(0,20), ylim = c(0,20))定义绘图窗口范围,因为这将产生放大查看窗口的效果,而不是裁剪掉窗口外的所有数据点,作为您的xlim()ylim()scale_x_continuous(limits = ...)scale_y_continuous(limits = ...)的快捷方式。对于geom_point,这不是问题,但对于geom_circle,您的方法将导致截止圆。)

相关问题