2016-02-26 51 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

但是,我會如何選擇與添加?距離線?用移除的初始點計算另一個凸包? (這實際上可能工作得很好) –