【问题标题】:maximum plot points in R?R中的最大绘图点?
【发布时间】:2009-12-26 08:54:20
【问题描述】:

我遇到过很多情况,我想绘制的点比我真正应该的要多——主要的问题是当我与人们分享我的情节或将它们嵌入到论文中时,它们占据了太多的空间。在数据框中随机采样行非常简单。

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

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 论文中。我想这样做的方法是减少传达我的数据所需的绘图点的数量。
  • 那么子抽样可能是您最好的选择。这当然可以通过“非均匀”采样来完成,因此您可能希望从尾部保留更多点(甚至全部),但可以负担得起大幅减薄主要部分。但这似乎是针对特定问题的,因此您可能必须自己动手。

标签: r plot


【解决方案1】:

在这种情况下,我倾向于使用 png 文件而不是基于矢量的图形,例如 pdf 或 eps。这些文件要小得多,尽管您会失去分辨率。

如果它是一个更传统的散点图,那么使用半透明颜色也有帮助,并解决了过度绘图问题。例如,

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

【讨论】:

    【解决方案2】:

    除了 Rob 的建议之外,我喜欢的一个绘图功能是 hexbin;一个例子是at the R Graph Gallery

    【讨论】:

    • 或者,使用 ggplot2,geom = "hex"
    【解决方案3】:

    如果对 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, ...)
    }
    

    使用上面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)
    【解决方案4】:

    我要么制作已经提到的Rob 的图像文件(png 或 jpeg 设备),要么制作 2D histogram. 2D 直方图的替代品是 smoothed scatterplot,它制作类似的图形但从密集到稀疏的空间区域具有更平滑的截止。

    如果您以前从未见过addictedtor,那么值得一看。它在 R 中生成了一些非常漂亮的图形,带有图像和示例代码。

    这是来自addictedtor 站点的示例代码:

    二维直方图:

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

    平滑散射:

    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),我该如何定位这个坐标?在使用 r 的情节中?非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    相关资源
    最近更新 更多