2009-12-26 64 views
7

我遇到過很多情況,我想繪製的點數比我真正應該達到的要多 - 主要的缺點是,當我與人分享我的情節或將它們嵌入到論文中時,它們佔據了太多的空間。在數據框中隨機抽樣行非常簡單。R中的最大繪圖點數?

,如果我想爲一個點的情節真正的隨機樣本,可以很容易地說:

ggplot(x,y,data=myDf[sample(1:nrow(myDf),1000),]) 

不過,我想知道是否有更有效的(理想罐裝)的方式來指定的積點的數量這樣你的實際數據就能準確地反映在情節中。所以這裏是一個例子。 假設我正在繪製諸如重尾分佈的CCDF之類的東西,例如,

ccdf <- function(myList,density=FALSE) 
{ 
    # generates the CCDF of a list or vector 
    freqs = table(myList) 
    X = rev(as.numeric(names(freqs))) 
    Y =cumsum(rev(as.list(freqs))); 
    data.frame(x=X,count=Y) 
} 
qplot(x,count,data=ccdf(rlnorm(10000,3,2.4)),log='xy') 

這將產生y軸變得越來越密的圖。在這裏,爲較大的x或y值繪製較少的樣本是理想的。

有沒有人對處理類似問題有任何提示或建議?

感謝, -e

+0

您好羅布,德克 - 我要澄清的是我不尋找一種方法來處理使用不同可視化方法的重疊繪圖。我特別想做一個情節點,我可以在一個乳膠紙作爲嵌入一個可伸縮矢量圖形。我想這樣做的方式是減少傳達我的數據所需的繪圖點數。 – eytan 2009-12-26 15:18:46

+0

然後子採樣可能是你最好的選擇。當然可以用「非均勻」採樣來完成,所以你可能想從尾部保持更多的點(甚至全部),但能買得起變薄的主要部分顯着。但這看起來有問題,所以你可能不得不自己做飯。 – 2009-12-26 17:37:20

回答

4

下面是用於相對於下采樣陰謀x軸的一個可能的解決方案中,如果對數轉換。它記錄變換x軸,輪即數量,並在該倉採位數x值:

downsampled_qplot <- function(x,y,data,rounding=0, ...) { 
    # assumes we are doing log=xy or log=x 
    group = factor(round(log(data$x),rounding)) 
    d <- do.call(rbind, by(data, group, 
    function(X) X[order(X$x)[floor(length(X)/2)],])) 
    qplot(x,count,data=d, ...) 
} 

使用的ccdf()從上面的定義,我們就可以比較分佈的CCDF的原創情節與間苗版本:

myccdf=ccdf(rlnorm(10000,3,2.4)) 

qplot(x,count,data=myccdf,log='xy',main='original') 

downsampled_qplot(x,count,data=myccdf,log='xy',rounding=1,main='rounding = 1') 

downsampled_qplot(x,count,data=myccdf,log='xy',rounding=0,main='rounding = 0') 

在PDF格式,原來的情節佔用640K,並間苗版本分別佔據20K和8K。

+0

而不是四捨五入,還可以更一般地做類似於: group = cut(log(data $ x),b = maxpoints) – eytan 2009-12-26 19:14:17

8

我傾向於使用PNG文件,而不是基於矢量圖形,如PDF或EPS爲這種情況。雖然您失去了解決方案,但文件要小得多。

如果它是一個更傳統的散點圖,然後用半透明的顏色也有所幫助,以及解決過度繪製問題。例如,

x <- rnorm(10000); y <- rnorm(10000) 
qplot(x, y, colour=I(alpha("blue",1/25))) 
5

超越羅布的建議,一個繪圖功能我想因爲它的「細化」對你來說是hexbin;一個例子是at the R Graph Gallery

+3

或者,用ggplot2,'geom =「hex」' – hadley 2009-12-26 17:24:43

2

我要麼使圖像文件(PNG或JPEG設備)作爲Rob已經提到的,或我會成爲一個2D histogram.到2D直方圖的替代方案是一個smoothed scatterplot,它使一個類似的圖形,但是具有更平滑的截止從密集到稀疏的空間區域。

如果你以前從未見過addictedtor,這是值得一試。它有一些非常好的R圖像和示例代碼生成的圖形。

下面是來自addictedtor網站示例代碼:

2-d直方圖:

require(gplots) 

# example data, bivariate normal, no correlation 
x <- rnorm(2000, sd=4) 
y <- rnorm(2000, sd=1) 

# separate scales for each axis, this looks circular 
hist2d(x,y, nbins=50, col = c("white",heat.colors(16))) 
rug(x,side=1) 
rug(y,side=2) 
box() 

smoothscatter:

library("geneplotter") ## from BioConductor 
require("RColorBrewer") ## from CRAN 

x1 <- matrix(rnorm(1e4), ncol=2) 
x2 <- matrix(rnorm(1e4, mean=3, sd=1.5), ncol=2) 
x <- rbind(x1,x2) 

layout(matrix(1:4, ncol=2, byrow=TRUE)) 
op <- par(mar=rep(2,4)) 
smoothScatter(x, nrpoints=0) 
smoothScatter(x) 
smoothScatter(x, nrpoints=Inf, 
       colramp=colorRampPalette(brewer.pal(9,"YlOrRd")), 
       bandwidth=40) 
colors <- densCols(x) 
plot(x, col=colors, pch=20) 

par(op)