我想知道是否有任何方法可以让 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 扩展控制的更多信息,请参阅)。