ggplot2 z裁剪:删除重叠堆栈中不必要的点

时间:2016-02-26 16:56:14

标签: r ggplot2

考虑以下绘制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)

enter image description here

我现在想要将图像保存为矢量图形,例如用PDF格式。这不是上述示例的问题,但是一旦我获得了超过一百万点(例如来自火山图),一页的文件大小可能超过100 MB,显示或编辑需要很长时间。< / p>

在上面的示例中,相同的形状仍然可以用

表示
  • 将点转换为形状轮廓,或
  • 保留一些积分并弃掉其余部分。

有没有办法(或者最好是已经这样做的工具)从一个永远不可见的情节中删除点? (理想情况下支持透明度)

到目前为止,我听到的最好的方法是围绕点的位置并移除具有&gt;的网格点。 N点,然后使用剩余的原始位置。还有什么更好的吗?

请注意,这应该适用于任意结构的点,并且只删除那些不可见的点。

1 个答案:

答案 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)

得到以下特性:

enter image description here

(请注意,我从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)

这样做: enter image description here