【问题标题】:How to reduce the EPS-format output of gnuplot?如何减少 gnuplot 的 EPS 格式输出?
【发布时间】:2023-03-20 02:01:01
【问题描述】:

我有大量数据,我想从中创建散点图并将其包含在我的 LaTeX 文档中。我使用 gnuplot 生成具有 epslatex 输出格式的散点图,以便能够轻松地将数据导入我的 LaTeX 文档。

我的问题是 EPS 文件太大(每个图大约 14MB),这将导致输出文档非常大。显然,原因是所有数据都包含在不需要的 EPS 文件中。

但是,我找不到压缩 EPS 文件的方法。唯一的方法是减少我拥有的样本点数量,但出于技术原因,我不希望这样做。

谁能给我建议一种减小 EPS 图大小的方法?

我尝试使用 ImageMagick 并降低 EPS 文件的分辨率(如 convert -units PixelsPerInch plot.eps -density 300 plot2.eps),但它缩小了尺寸,这不是我想要的。

提前致谢,

【问题讨论】:

    标签: latex gnuplot eps


    【解决方案1】:

    我对这个问题的解决方案是gnuplot中的“​​every”命令,即

    plot "datafile" u 1:2 every 10
    

    像这样,您已经可以将 eps 图形的大小减小 10 倍。当然,您需要自己弄清楚可以省略多少数据而不会丢失太多信息,即该图形仍应包含所有您想要可视化的功能。

    如果不需要,我通常将 eps 转换为适当大小的光栅图像,然后将其转换回 eps。同样在这里你必须玩弄分辨率等

    【讨论】:

    • 非常感谢。我试过这个,它在一定程度上有所帮助,但问题是 eps 输出的大小仍然很大(如果我在我的 LaTeX 文档中包含 5 个这种类型的图,则生成的 PDF 文件的大小将高达 6 MB) .也许我应该使用更大的下采样因子,但要足够小以保留我想要展示的功能。
    【解决方案2】:

    .eps 文件的问题不一定是分辨率(它们是矢量图形),而是 gnuplot 在创建文件时包含的信息量。 Gnuplot 倾向于绘制包含大量额外信息的 .eps 文件,尤其是对于 2D 绘图和具有大量点的绘图。例如,对于在边缘连接的红色方块网格以形成一个大红色方块,gnuplot 将绘制大量的红色小方块而不是大方块。这个问题在this blog post 的末尾提到,他们说plot ... with imagesplot 创建热图的输出要小得多。

    听起来你好像没有使用splot,所以你可以尝试制作一个.pdf而不是.eps,如果你需要.eps使用pdf2ps或其他程序转换它。这可能会有所帮助...

    出于好奇,您要绘制多少点?如果您能给出您使用的数据量的想法,以及您现在正在使用的一些示例代码,我们或许能够提供更好的想法。

    【讨论】:

    • 我正在使用plotset terminal epslatex size 8cm,8cm color colortext; set output "plot.tex"; plot "temp.dat" using 2:4 w p title "";其中“temp.dat”是一个包含大约 1'000'000 行的文件,每行在第二列和第四列中都有所需的数据。
    • 我明白了。我同意 Raphael 的回答——如果你想显示一百万个数据点,那么无论你使用矢量图形如何,都会产生一个巨大的文件。我建议制作一个高分辨率的 .png 图像,或者以某种方式过滤数据,例如使用 every 命令。
    • 当前的 gnuplot 开发版本有一个用于 postscript 和 epslatex 终端的 level3 选项,它使用 PNG 编码从 plot ... with image 嵌入位图。这可以大大减小图像大小。
    【解决方案3】:

    我遇到了一个类似的问题,即超过 10^6 个点的散点图导致 PDF 文件大于 100 MB。这些点以非常低的不透明度 (1%) 绘制,因此根本只有许多分层点可见,从而产生更平滑的密度分布而不是散点图。因此,我非常不愿意听从 Raphael Roth 的建议并精简数据。

    相反,我发现创建一个单独的 Gnuplot 脚本以使用 pngcairo 终端将数据绘制到具有足够分辨率的 PNG 位图图像非常有用。该图没有轴,没有抽动,没有边框,也没有边距——只有在适当坐标中绘制的数据:

    set terminal pngcairo transparent size 400,400
    set output 'foo.png'
    set margins 0,0,0,0
    set border 0
    unset xtics
    unset ytics
    # set xrange, yrange appropriately
    plot ... with points notitle
    

    然后,在实际绘图中(为此我使用了cairolatex 终端),我绘制了这个PNG图像:

    set terminal cairolatex pdf
    # regular setup, using the same xrange and yrange
    plot 'foo.png' binary filetype=png with rgbalpha axes x2y2
    

    请注意,我使用另一组(无刻度)轴进行绘图,以确保图像填充图形区域而没有任何边框,因此 x1y1 轴上的刻度与散点图中点的实际位置相匹配。

    PNG 最终只有几十 KB,而 PDF 则只有几 MB。我认为rgbalpha 的情节风格(类似于with image)不是最有效的,但这对我来说已经足够了。

    希望有人会觉得这很有用。

    【讨论】:

    • 另请参阅tex.stackexchange.com/a/131106/33933,了解我身边的相关测试。
    • @Christoph 你不知道cairolatex 终端是否有类似level3 的选项?还是这是默认设置?
    • 另一方面,需要注意的是 Apple 的 PDF 引擎(以及 Firefox 和(可能?)Chrome 中的 pdf.js 查看器)应用平滑放大(插值)到嵌入的PNG绘制with image。需要明确的是,我并不是指pm3d 的(期望的)插值,而是一个不应该存在的插值。这可以通过使用with image pixels 来避免,该with image pixels 回退到绘制矩形(导致大文件)。见gnuplot> help image pixels
    • cairolatex 没有这样的选项 AFAIK,这些细节被推迟到 cairo,而 epslatex 是由 gnuplot 逐字节写入的。您可能还想尝试set terminal tikz externalimages,我自己还没有尝试过。插值问题也发生在pdf上吗?我只知道 eps 有问题,请参阅我的 cmets stackoverflow.com/q/25736904/2604213
    • 是的,它也发生在 pdf 输出中。它甚至不限于预览。
    猜你喜欢
    • 1970-01-01
    • 2014-01-06
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多