我注意到pgfplots/table
软件包中有一个异常。我不知道这是错误还是功能。
错误代码
\documentclass[]{standalone}
\usepackage{pgfplots, pgfplotstable}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot table[x=X,
y={create col/expr={\thisrow{X}^2}}] {
X Y
1 1
2 2
3 3
4 4
5 5
};
\end{axis}
\end{tikzpicture}
\end{document}
! 未定义控制序列。.../table/create on use/create col/expr={\thisrow {X}^2}/.@cmd l.16 };
当我遇到这个错误时,我很长时间都无法理解其原因。
这种代码有效:
\documentclass[]{standalone}
\usepackage{pgfplots, pgfplotstable}
\begin{document}
\begin{tikzpicture}
\pgfplotstableread {
X Y
1 1
2 2
3 3
4 4
5 5
}\data
\begin{axis}
\addplot table[x=X,
y={create col/expr={\thisrow{X}^2}}] \data;
\end{axis}
\end{tikzpicture}
\end{document}
就是说我一开始公布表的话,是没有错误的。
这个也有效:
\documentclass[]{standalone}
\usepackage{pgfplots, pgfplotstable}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot table[x=X,
create on use/Z/.style={create col/expr={\thisrow{X}^2}},
y=Z] {
X Y
1 1
2 2
3 3
4 4
5 5
};
\end{axis}
\end{tikzpicture}
\end{document}
在最后一个示例中,我们通过样式添加列。奇怪的是,这是通过样式完成的,尽管它与样式无关。
这里的实现本身是否存在不一致之处?为什么第一个例子不起作用,给出一个不明显的错误?
答案1
PGFPlots 需要读取整个表来创建新列:
read completely
此键只有一个用途,即动态创建后处理列,然后绘制这些列。
默认情况下,只有当有时才将表读入内存create on use
。
\documentclass[tikz, border=1cm]{standalone}
\usepackage{pgfplots, pgfplotstable}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot table[read completely, x=X, y={create col/expr={\thisrow{X}^2}}] {
X Y
1 1
2 2
3 3
4 4
5 5
};
\end{axis}
\end{tikzpicture}
\end{document}
当然,更好的方法是使用\addplot table [x=X, y expr={\thisrow{X}^2}]