考虑以下绘制100个重叠点的示例:
ggplot(data.frame(x=rnorm(100), y=rnorm(100)), aes(x=x, y=y)) +
geom_point(size=100) +
xlim(-10, 10) +
ylim(-10, 10)
我现在想要将图像保存为矢量图形,例如用PDF格式。这不是上述示例的问题,但是一旦我获得了超过一百万点(例如来自火山图),一页的文件大小可能超过100 MB,显示或编辑需要很长时间。< / p>
在上面的示例中,相同的形状仍然可以用
表示有没有办法(或者最好是已经这样做的工具)从一个永远不可见的情节中删除点? (理想情况下支持透明度)
到目前为止,我听到的最好的方法是围绕点的位置并移除具有&gt;的网格点。 N点,然后使用剩余的原始位置。还有什么更好的吗?
请注意,这应该适用于任意结构的点,并且只删除那些不可见的点。
答案 0 :(得分:2)
你可以用凸包做这样的事情,填充构成凸包的多边形:
library(ggplot2)
set.seed(123)
df <- data.frame(x = rnorm(100), y = rnorm(100))
idx <- chull(df)
ggplot(df, aes(x = x, y = y)) +
geom_point(size = 100,color="darkgrey") +
geom_polygon(data=df[idx,],color="blue") +
geom_point(size = 1, color = "red", size = 2) +
xlim(-10, 10) +
ylim(-10, 10)
得到以下特性:
(请注意,我从Hadley的“Extending ggplot2”指南https://cran.r-project.org/web/packages/ggplot2/vignettes/extending-ggplot2.html中提取了这个传奇故事。)
在您的情况下,您会放弃geom_point
来电,并在geom_polygon
上设置透明度。还不确定chull
对数百万点的速度有多快,但显然比绘制它们的速度要快。
我不确定你追求的是什么。如果你真的想要100像素半径,那么你可能只需要对复杂船体上的那些进行处理,再加上geom_polygon
填充中间部分。
所以使用这段代码:
ggplot(df[idx,], aes(x = x, y = y)) +
geom_point(size = 100, color = "black") +
geom_polygon(fill = "black") +
xlim(-10, 10) +
ylim(-10, 10)