【问题标题】:Reduce PDF file size of plots by filtering hidden objects通过过滤隐藏对象来减小绘图的 PDF 文件大小
【发布时间】:2013-05-15 22:47:30
【问题描述】:

在 R 中生成许多点的散点图时(例如使用 ggplot()),可能有许多点在其他点之后并且根本不可见。例如看下图:

这是几十万点的散点图,但大部分都在其他点的后面。问题是在将输出转换为矢量文件(例如 PDF 文件)时,不可见的点会使文件变大,并在查看文件时增加内存和 cpu 使用率。

一个简单的解决方案是将输出转换为位图图片(例如 TIFF 或 PNG),但它们会失去矢量质量并且尺寸可能更大。我尝试了一些在线 PDF 压缩器,但结果与我的原始文件大小相同。

有什么好的解决办法吗?例如某种过滤不可见点的方法,可能在生成绘图期间或之后通过编辑 PDF 文件?

【问题讨论】:

  • 推荐的解决方案是十六进制图。但是,在 hexbin 图中,颜色表示每个 bin 中值的数量,您似乎将颜色用于其他用途。
  • +1 表示十六进制。其他选项是 sunflowerplotbigvis 包:github.com/hadley/bigvis
  • @Roland 是的,正如你猜到的点的颜色是有意义的,所以对我来说 hexbin 不是一个好的解决方案
  • 如果颜色有意义,你想如何处理隐藏在彼此后面的不同颜色的点?我不认为这是一个好的情节。
  • 我有点怀疑“隐藏”点并不重要。如果这是真的,您应该在更早的时候将它们从您的分析中删除。我倾向于建议对这种情节使用部分透明度,例如color = #FF00FF44 以便您了解数据点的密度。

标签: r pdf vector plot ggplot2


【解决方案1】:

我认为这可以通过对 pdf 文件进行一些后处理来完成。在linux中,如果我必须减少pdf,我会这样做

pdf2ps input.pdf output.ps
ps2pdf output.ps output.pdf

由于某种原因,它非常有效。

您可以在https://askubuntu.com/questions/113544/how-to-reduce-pdf-filesize 看到一些讨论。

【讨论】:

  • 谢谢,但它们的大小完全相同,可能是因为初始 PDF 文件是矢量文件而不是位图文件。我尝试了您的 ask-ubuntu 链接的几种解决方案。
【解决方案2】:

一开始你可以这样做:

set.seed(42)
DF <- data.frame(x=x<-runif(1e6),y=x+rnorm(1e6,sd=0.1))
plot(y~x,data=DF,pch=".",cex=4)

PDF 大小:6334 KB

DF2 <- data.frame(x=round(DF$x,3),y=round(DF$y,3))
DF2 <- DF[!duplicated(DF2),]
nrow(DF2)
#[1] 373429
plot(y~x,data=DF2,pch=".",cex=4)

PDF 大小:2373 KB

通过四舍五入,您可以控制要删除的值的数量。你只需要修改它来处理不同的颜色。

【讨论】:

  • 我们可以先将 X 和 Y 值除以我们希望的点之间的最小水平/垂直距离,将其四舍五入,然后过滤掉重复项:temp &lt;- round(DF2 / .1); DF2 &lt;- DF2[!duplicated(temp),]
  • +1 表示舍入的好主意!这是一个非常棒的解决方案,大大减少了我的 PDF 大小。非常感谢
【解决方案3】:

只需将绘图保存为高分辨率 png 文件即可大大减小尺寸,同时保持足够好的质量。至少我从来没有让期刊抱怨过我发送给他们的任何 png,只要确保使用 > 600 dpi。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 2019-03-03
    • 1970-01-01
    • 2020-05-21
    • 2019-02-13
    相关资源
    最近更新 更多