我遇到过一些情况,我想要绘制比我真正应该得到的更多的点数 - 主要是因为当我与人分享我的情节或将它们嵌入文件时,它们占据了太多的空间.在数据帧中随机抽样行非常简单.
如果我想要一个真正的随机样本的点图,很容易说:
ggplot(x,y,data=myDf[sample(1:nrow(myDf),1000),])
Run Code Online (Sandbox Code Playgroud)
但是,我想知道是否有更有效(理想的罐装)方式来指定绘图点的数量,以便您的实际数据准确地反映在绘图中.所以这是一个例子.假设我正在绘制类似于重尾分布的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')
Run Code Online (Sandbox Code Playgroud)
这将产生x和y轴变得越来越密集的图.在这里,为较大的x或y值绘制较少的样本是理想的.
有没有人对处理类似问题有任何提示或建议?
谢谢,-e
在这种情况下,我倾向于使用png文件而不是基于矢量的图形,例如pdf或eps.尽管丢失了分辨率,但文件要小得多.
如果它是一个更传统的散点图,那么使用半透明颜色也有帮助,以及解决过度绘图问题.例如,
x <- rnorm(10000); y <- rnorm(10000)
qplot(x, y, colour=I(alpha("blue",1/25)))
Run Code Online (Sandbox Code Playgroud)
如果对数转换,这是相对于 x 轴下采样图的一种可能的解决方案。它对 x 轴进行对数变换,对该数量进行舍入,并选取该 bin 中的中值 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, ...)
}
Run Code Online (Sandbox Code Playgroud)
ccdf()使用上面的定义,我们可以将分布的 CCDF 的原始图与下采样版本进行比较:
myccdf=ccdf(rlnorm(10000,3,2.4))
qplot(x,count,data=myccdf,log='xy',main='original')
Run Code Online (Sandbox Code Playgroud)

downsampled_qplot(x,count,data=myccdf,log='xy',rounding=1,main='rounding = 1')
Run Code Online (Sandbox Code Playgroud)

downsampled_qplot(x,count,data=myccdf,log='xy',rounding=0,main='rounding = 0')
Run Code Online (Sandbox Code Playgroud)

在 PDF 格式中,原始图占用 640K,下采样版本分别占用 20K 和 8K。