2016-02-26 47 views
1

考虑绘图100个重叠点的下面的例子:GGPLOT2ž削波:以重叠的堆叠移除不必要的点

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中。这对上面的例子来说不是问题,但是一旦我获得了超过一百万个点(例如从火山图),文件大小可能超过100MB,并且需要很长的时间才能显示或编辑。

在上述例子中相同的形状可能仍然可以通过任一

  • 转换点的形状的轮廓,或
  • 表示保持几个百分点并丢弃其余部分。

是否有任何方法(或最好是已经做到这一点的工具)从一个永远不可见的情节中删除点? (理想地支持透明度)

到目前为止我听到的最好方法是圆点的位置并移除具有> N个点的网格点,然后使用剩余点的原始位置。有更好的吗?

请注意,这应该与一个任意结构的点,只有删除那些不可见。

+0

你能使用geom_tile()或geom_raster()呢?它基本上是一个3D直方图,因此它将汇总每个单元格的数据,您可以使用“断点”参数尽可能小。如果这很有用,它还会显示每个单元格中有多少个点(即有多少点重叠),但是您可以手动将填充设置为黑色并使用不会更改的变量(或组成虚拟列如果它需要看起来像你的例子。 [链接](http://docs.ggplot2.org/current/geom_tile.html) – RTB

+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

(请注意,我把这个想法来自哈德利的“扩展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

+0

我喜欢凸包的想法。问题在于,与'geom_point'结合,如果我在A-B-C行中有点,它可能会下降B,即使对于更远的距离B点将添加到A-B-C的轮廓。 –

+0

您可以在后处理步骤中通过添加点来处理该问题。 –

+0

但是,我会如何选择与添加?距离线?用移除的初始点计算另一个凸包? (这实际上可能工作得很好) –