我尝试使用ggplot2
制作散点图,其中点的直径与轴上的变量具有相同的维度,并且应该具有相同的比例。这个问题在this question和this one中都得到了很好的解决,这是通过在图形上绘制椭圆来解决的(现在使用geom_circle
从ggforce
开始)。然而,对于我的应用程序,我需要绘制数千个点,使用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_radius
和scale_continuous
,但是两者都使用相对于轴标度而言任意的标度(scale_radius
也不会缩放,这样大小为0的点就会显示大小为0)。我有了使用ggplot_build
访问绘图大小并相应地缩放点大小的想法。我可以使用ggplot_buil(p)$layout$get_scales(i=1)
或layer_scales(p)
访问绘图范围,但没有变量与scale_radius
使用的单位中的绘图大小相对应。
1条答案
按热度按时间lhcgjxsq1#
使用2000个圆和最大半径1(即最大直径2),我得到了~5- 7倍的加速比使用较低的多边形分辨率每圆。你也可以看看你的输出设备,并尝试
ragg
,这是比cairo更快,仍然提供良好的抗锯齿。看起来还是很不错的,在我的系统上有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
,您的方法将导致截止圆。)