来自文件的 pgfplots 轴描述

来自文件的 pgfplots 轴描述

我想知道是否有任何方法可以让 pgfplots 从文件中读取 xlabel 和 ylabel。这与这个问题类似在 PGFplot 中使用文件中的标签但我想阅读列标题并将它们用作轴描述(而不是作为单个刻度的标签)。

继续使用另一篇文章中的例子,对于这样的文件 foo.dat

# foo.dat
# X-Position Height
  1          15
  2          20
  3          12
  4          24

我想要一个相当于

\begin{axis}[xlabel=X-Position, ylabel=Height]
   \addplot file {foo.dat};
\end{axis}

但无需xlabel=X-Position, ylabel=Height明确指定。

出现这个奇怪问题的原因是我在脚本中使用 tex 文件来生成绘图图像。没有轴描述,我可以生成一个数据文件,将数据文件和准备好的 tex 文件复制到临时文件夹中并编译所有内容。如果我所要求的不可行,我将不得不更改 tex 文件。在这种情况下,我可以通过动态生成 tex 文件来解决这个问题,但我只是想知道是否有更好的解决方案。

答案1

是的,使用 的宏可以实现pgfplotstable(它总是与 一起发货pgfplots)。

pgfplotstable允许将表读入某些内存结构,并且它支持\pgfplotstableforeachcolumn<\tablename>\as<\loopvariable>{<loop body>}。在内部<loop body>,宏<\loopvariable>扩展为列名并\pgfplotstablecol扩展为列索引。

因此,我们可以遍历所有列并访问名称和索引。我们只需要将其与 TeX 扩展技巧以及从列索引到轴方向的映射(0=>x,1=>y)相结合,即可获得一个可运行的原型:


\documentclass[a4paper]{article}

\usepackage{filecontents}

\begin{filecontents}{foo.dat}
# foo.dat
 X-Position Height
  1          15
  2          20
  3          12
  4          24
\end{filecontents}

\usepackage{pgfplots}
\pgfplotsset{compat=1.3}
\usepackage{pgfplotstable}

\begin{document}

\begin{tikzpicture}
    % this here allows to set labels by INDEX rather than 'x', 'y', or 'z':
    \pgfplotsset{
        label no 0/.style={xlabel={#1}},
        label no 1/.style={ylabel={#1}},
        label no 2/.style={zlabel={#1}},
    }
    % this loads your external data file:
    \pgfplotstableread{foo.dat}\loadedtable

    % this iterates over every column name, where the current column name is stored in
    % '\col':
    \pgfplotstableforeachcolumn\loadedtable\as\col{%
        % this here defines '\temp' to be 
        %   '\pgfplotsset{label no 0={X-Position}}'
        % instead of
        %   '\pgfplotsset{label no 0={\col}}'
        % purpose: '\col' must be expanded (\'e'def) immediately
        % before it is overwritten in the next loop iteration.
        \edef\temp{\noexpand\pgfplotsset{label no \pgfplotstablecol={\col}}}
        % this here calls '\temp':
        \temp
    }%

    % the axis always uses the currently set options - in our case
    % 'xlabel' and 'ylabel':
    \begin{axis}
    \addplot table {\loadedtable};  
    \end{axis}
\end{tikzpicture}
\end{document}

请注意,我删除了#列标题前的foo.dat:将忽略以(被视为注释字符)pgfplotstable开头的任何数据行。#

语法<name>/.style={<stuff>} 是 pgf 定义一种名为 的样式的方式<name>。每当使用 时,它都会扩展为替换为 的键<name>={<value>}。这就是从列索引到 x、y 和 z 的映射方式。<stuff>#1<value>

剩下的棘手部分\edef正是我在源注释中写到的 - 但并不为人所知。它是 TeX 中的某种脚本元素( texdoc TeX-programming-Notes如果您想了解有关 TeX 扩展控制的更多信息,请参阅)。

相关内容