R中的最大绘图点数是多少?

7

我遇到了许多情况,想要绘制比我实际需要的更多的点 - 主要问题是当我与他人分享我的图形或将它们嵌入论文时,它们占用太多空间。从数据框中随机抽样行非常简单。

如果我想要一个真正的随机样本来绘制点图,很容易说:

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')

这将生成一个x和y轴变得越来越密集的图。在此情况下,最好少绘制大x或y值的样本。

有人对处理类似问题有什么技巧或建议吗?

谢谢, -e


你好,Rob和Dirk - 我想澄清一下,我不是在寻找使用不同的可视化方法来处理过度绘制的方法。我特别想做一个点图,可以将其嵌入到LaTeX论文中作为可缩放矢量图形。我希望通过减少传达数据所需的绘图点数来实现这一点。 - eytan
那么子采样可能是您的最佳选择。当然,这可以通过“非均匀”采样来完成,因此您可能希望保留尾部的更多点(甚至全部),但可以大幅稀疏主要部分。但这似乎是问题特定的,因此您可能需要自己解决它。 - Dirk Eddelbuettel
4个回答

8

在这种情况下,我倾向于使用png文件而不是pdf或eps等基于矢量的图形。文件更小,但你会失去分辨率。

如果是更传统的散点图,则使用半透明颜色也有帮助,同时解决了过度绘制的问题。例如:

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

5

除了Rob的建议之外,我喜欢的一个绘图函数是hexbin,因为它可以自动进行“稀疏化”处理;一个例子可以在R Graph Gallery中找到。


3
使用ggplot2中的geom = "hex"可以绘制六边形图。 - hadley

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。


与其四舍五入,我们也可以更普遍地做如下操作:group = cut(log(data$x), b=maxpoints) - eytan

2
我会将图像文件(png或jpeg设备),如Rob所提到的,或者制作一个2D直方图。2D直方图的替代品是平滑散点图,它制作了类似的图形,但在空间密集区域和稀疏区域之间具有更平滑的截止值。
如果你以前从未见过addictedtor,那么它值得一看。它使用R生成了一些非常漂亮的图形和示例代码。
这是来自addictedtor网站的示例代码:
2D直方图:
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)

请问能否帮我用R编程找到多条线图中的最小点坐标?例如,如果最小点坐标为(17,2.333),那么我该如何在图中定位这个坐标?非常感谢您的帮助! - Stackuser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接