2009-12-26 102 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)