使用 5 千行的数据文件绘制实验数据?

使用 5 千行的数据文件绘制实验数据?

我想在我的论文中说明各种实验数据,例如:

  • X射线粉末衍射数据(千线)
  • FTIR 数据(5 千线)
  • TG-/DTA 数据(5千线)

我想知道如何获得一个体面、方便的工作流程并获得令人满意的结果。

我正在使用 pgfplots,已经能够通过扩展 TeX 内存大小为我的 XRD 数据(1k 点)创建图表。但我无法为我的 FTIR 实验(5k 点)创建图表。虽然我真的想以一致和定性的方式呈现我的图表,但在我看来,使用 pgfplots 对于这种任务来说并不是很方便?!

  • 在 pgfplots 的情况下。如何绘制超过 5k 个点的 FTIR 光谱?使用 pgfplots 执行此类任务是否方便,如果不方便...
  • 您会推荐什么方法来最好地实现良好的工作流程并与我论文中的大量图表取得可观的成果相结合?

我目前的工作流程:在准备阶段,我使用 qtiplot 来规范化和转换绘图数据,以便在一张图中比较显示各种绘图。之后,我将这个经过处理的数据表导出到 .txt 文件。

\documentclass[a4paper,10pt]{article}
\usepackage[latin9]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
%opening
\title{XRD pattern with pgfplots}
\author{Max Muster}

\begin{document}
\maketitle
\section{section with pgfplots-test}
\begin{tikzpicture}
  \axis[
x dir       = reverse,
xlabel      = pgftemplate,
xmin        = 350,
xmax        = 4000,
yticklabels =
]
  \pgfplotstableread{overview.txt}
    \datatable
\addplot[color=black,mark=none] table[y = 1st plot, header = false] from \datatable ;
\addplot[color=black,mark=none] table[y = 2nd plot] from \datatable ;
\addplot[color=black,mark=none] table[y = 3rd plot] from \datatable ;
\addplot[color=black,mark=none] table[y = 4th plot] from \datatable ;
\addplot[color=black,mark=none] table[y = 5th plot] from \datatable ;
  \endaxis
\end{tikzpicture}

\end{document}

答案1

这个答案是指您希望这些图表与论文的其余部分保持一致。

我相信pgfplots可以做这种事情,尽管它需要更长的时间R

但是,如果你改变输入法,你可以轻松提高速度:\addplot table {\datatable};\addplot table {overview.txt};的时间和内存使用量可能会减少。至少时间消耗会大大减少(请参阅下面的解释)

我刚刚生成了几个虚拟图来查看它是否有效。我相信从可扩展性的角度来看它们类似于您的用例。

\documentclass{standalone}

\usepackage{pgfplots}

\pgfplotsset{compat=1.8}

\begin{document}

    \begin{tikzpicture}
    \begin{axis}
    \addplot[color=red,mark=none,samples=5000,id=1] gnuplot {rand(0)};
    \addplot[color=green,mark=none,samples=5000,id=2] gnuplot {rand(0)};
    \addplot[color=black,mark=none,samples=5000,id=3] gnuplot {rand(0)};
    \addplot[color=blue,mark=none,samples=5000,id=4] gnuplot {rand(0)};
    \addplot[color=orange,mark=none,samples=5000,id=5] gnuplot {rand(0)};
    \end{axis}
    \end{tikzpicture}
\end{document}

这次尝试使用了

Here is how much of TeX's memory you used:
 20614 strings out of 495035
 531998 string characters out of 3781519
 10114824 words of memory out of 15069104
 23486 multiletter control sequences out of 15000+200000
 3640 words of font info for 14 fonts, out of 8000000 for 9000
 14 hyphenation exceptions out of 8191
 62i,10n,76p,693b,1768s stack positions out of 30000i,500n,10000p,200000b,80000s

之后我重新读取了生成的临时文件,gnuplot如下所示:

\documentclass{standalone}

\usepackage{pgfplots}

\pgfplotsset{compat=1.8}

\begin{document}

\begin{tikzpicture}
\begin{axis}
    \addplot[color=red,mark=none] table {P.1.table};
    \addplot[color=green,mark=none] table {P.2.table};
    \addplot[color=black,mark=none] table {P.3.table};
    \addplot[color=blue,mark=none] table {P.4.table};
    \addplot[color=orange,mark=none] table {P.5.table};
\end{axis}
\end{tikzpicture}

\end{document}

Here is how much of TeX's memory you used:
 20571 strings out of 495035
 531135 string characters out of 3781519
 10112441 words of memory out of 15066721
 23441 multiletter control sequences out of 15000+200000
 3640 words of font info for 14 fonts, out of 8000000 for 9000
 14 hyphenation exceptions out of 8191
 62i,10n,76p,694b,1762s stack positions out of 30000i,500n,10000p,200000b,80000s

生成这些图只花了几秒钟,我的数字提示了所需的内存设置。请注意,我pdflatex在这里使用了。lualatex将更加简单,因为lualatex动态分配内存,不需要繁琐的配置更改。

如果您需要一直这样做,您可能需要考虑其他解决方案。

如果您偶尔需要这样做(即每次重新生成数据文件时),使用外部库就可以了:在这种情况下,系统会自动将图像编译成单独的 pdf 并包含 pdf。在最佳情况下,您可以使用

\usetikzlibrary{external}
\tikzexternalize[mode=list and make]

因为这会自动检测您的输入文件是否发生变化,并且仅在需要时重新编译。如果您熟悉,请使用此功能make。如果您需要此类设置的帮助,请告知我们。

之所以\addplot table {<filename>}比预期快得多,\addplot table{<\loadedtable>};是意料之外的,它类似于 TeX 中最严重的弱点之一:TeX 既没有高效的数组,也没有高效的列表。事实上,\addplot table {<\loadedtable>};在数据点数量上,运行时间为二次方,而\addplot table {<filename>};在大约 100000 个数据点上,运行时间为线性。我不确定,但我相信内存也会产生影响(但仅与一个因素有关)。

相关内容