用许多 PGF 图编译我的文档,每个图都包含来自 CSV 文件的数千个数据点,这花费的时间太长了(几分钟)。我意识到拥有这么多数据点是没有意义的——如果有十分之一的数据点,就足以在纸上重新创建相同的图。
例如,我的一个文件包含 216000 行,格式如下:
0.000000000000000000e+00 0.000000000000000000e+00 1.388888888888888888e-04 -2.182787284255027771e-11
当然,这太多了。然后我读取该文件如下:
\documentclass{scrartcl}
\usepackage{pgfplots}
\pgfplotsset{compat=1.5.1}
\begin{document}
\begin{tikzpicture}
\begin{loglogaxis}[
\addplot[mark=*, color=red] file {Data/plotXYZ.dat};
\end{loglogaxis}
\end{tikzpicture}
\end{document}
是否可以只让包每隔 x 行执行一次以加快编译过程?或者还有其他方法可以使其(显著)加快?
我正在运行 Ubuntu,我的一个朋友建议我编写一个awk
脚本,该脚本可以遍历文件.csv
并仅保留每 x 行。但是,我不知道该怎么做,因为我awk
以前从未使用过。如果这是可选的选项,有人可以帮我设置这样的脚本吗?
答案1
pgfplots 提供过滤器each nth point=100
。
由于坐标过滤有不同的用例,您可能需要设置
each nth point=100, filter discard warning=false, unbounded coords=discard
这种组合不会对每个丢弃的点生成警告。此外,它会默默地丢弃 99 个点 - 就像你根本没有将它们写入输入流一样。请注意,另一种选择unbounded coords=jump
会明确中断你的情节(这不是你想要的)。
据报道,这种方法效果很好:事实上,所花的时间并不多,就像使用一些外部工具来过滤数据文件一样(最近一些高级用户通过邮件报告了这一点)。
答案2
虽然pgfplots
过滤器each nth point
在某种程度上可能是一种解决方案,但它肯定不是可以普遍使用的。例如,选择each nth point=100
可能会扭曲图中某些区域,而这些区域确实需要额外的点才能正确显示。另一方面,设置each nth point
为较低的数字可能在所使用的点数方面并不“经济”。
简而言之,需要更聪明的下采样方法该方法应该能够根据每个区域的绘图复杂程度动态调整保留的点数,以便我们仅使用所需的最少点数即可获得最佳的视觉效果(类似于乳胶能够在each nth point=?
图表“传递”期间自动调整多次)。
看一眼这个答案。
如果您有 matlab 或 octave,您可以使用matlab2tikz
那里提供的修改版本,它实现了一种有效的下采样算法。
另一方面,如果您既不使用 matlab 也不使用 octave,您仍然可以将该下采样算法(它在函数 pointReduction 中)转换为您想要的语言并使用它来对您的图形进行下采样,然后将其导出为 CSV。