2012-10-02 69 views
1

我有一個數據集,其中包含對連續四天(大約340'000個數據點)每秒的觀察結果。這太多了,無法在散點圖中顯示。我想只繪製2000個時間點的統一樣本。繪製時間序列的樣本

有沒有可能通過ggplot2的「圖形語法」方法實現這一點?我還沒有找到任何內置的「採樣」修改器,但也許寫起來很容易?

library(ggplot2) 

x <- 1:100000 
d <- data.frame(x=x, y=rnorm(length(x))) 
ggplot(d[sample(x, 2000), ], aes(x=x, y=y)) + geom_point() 

這是如何通過修改傳遞給ggplot的數據來「破解」它的。但我不想修改數據,只是將其過濾爲僅包含樣本。

ggplot(d, aes(x=x, y=y)) + ??? + geom_point() 

編輯:我專門找採樣,不平滑或裝箱。我所擁有的數據顯示了模擬特定過程一秒鐘所需的時間。仿真已並行化,並且對於每個模擬的秒數,我都有涉及的每個內核的運行時間(共8個)。我想通過繪製原始數據點來顯示次優負載平衡。抽樣的原因只是對於散點圖而言,300,000個數據點太多了:繪圖需要很長時間,可視化效果不佳。

+1

您必須在某個時間點對您的數據進行採樣AFAIK和您發佈的解決方案似乎很有效。與ggplot實現的任何額外的geom/transformation數據相比,這種方法會更快,佔用更少的內存。 – Chase

+1

我不會通過繪製數據*黑客*的子集來繪製數據的子集。 – mnel

+0

@mnel:我知道。這違背了ggplot2語法的美妙之處。數據進入ggplot未修改,期間。其他的都是可視化的。 – krlmlr

回答

3

您可以在geom_point呼叫使用數據參數子集:

... + geom_point(data=d[sample(x,2000),]) 

這樣,您可以自由添加使用的所有數據,如其他geoms,使用示例數據:

ggplot(d, aes(x=x, y=y)) + geom_hex() + geom_point(data=d[sample(x,2000),]) 

hexbin and sampled points

+0

另一種更改「活動」數據集的方法是使用'%+%'運算符:'ggplot()%+%d [sample(...),] + ...' – krlmlr

3

如果你想創建大數據散點圖這裏有一對夫婦的ggplot2選項

他們來自This course by hadley

# upload all images to imgur.com 
opts_chunk$set(fig.width = 5, fig.height = 5, dev = "png") 
render_markdown(strict = T) 


# some autocorrelated data 
set.seed(1) 
x <- 1:1e+05 
d <- data.frame(x = x) 
d$y <- arima.sim(list(order = c(1, 1, 0), ar = 0.9), n = 1e+05 - 1) 
# the basic plot 
base_plot <- ggplot(d, aes(x = x, y = y)) 

geom_bin2d

可以設置binwidthxy變量

base_plot + geom_bin2d(binwidth = c(200, 5)) 

enter image description here

geom_hex

可以設置的bins

base_plot + geom_hex(bins = 200) 

enter image description here

小分

停止數overplotting

base_plot + geom_point(size = I(".")) 

enter image description here

使用平滑

這依賴於具有平滑方法,將讓你想要的細節沒有崩潰或服用時間過長。在這種情況下,通過試驗和錯誤選擇的節點數(也許你會想更詳細)

library(mgcv) 
base_plot + stat_smooth(method = "gam", formula = y ~ s(x, k = 50)) 

enter image description here

+0

我提供的例子很好地捕捉了數據是什麼樣的。當然,這是一個大趨勢,稍後我會做一些分類或平滑處理;但首先我想繪製原始數據。 – krlmlr

+0

'base_plot + geom_point(size = I(「。」))'繪製原始數據 – mnel

+0

但是數據太多!沒有辦法獲得樣本(除了過濾數據)嗎? – krlmlr