使用旧版本的简化版本回答作为MWE:
\documentclass{article}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\foreach \A / \B / \C in {1/100/g, 2/200/h}
\addplot[
mark=diamond*,
visualization depends on={value \C\as\myC},
nodes near coords={\myC}
]
coordinates {(\B, \A)};
\end{axis}
\end{tikzpicture}
\end{document}
这按预期工作。但是,根据手册,我还应该能够只指定保存的宏,而不是为其分配新名称。所以:
\addplot[
mark=diamond*,
visualization depends on={value \C},
nodes near coords={\C}
]
但是,此操作失败并出现以下错误:
Package pgfplots Error: Sorry, `visualization depends on=value <
\macro>' expected a defined control sequence name instead of `\C '. Please make
sure `\C ' is a properly defined macro or use the `visualization depends on=va
lue <content> \as<\macro>' syntax instead.
为什么这个版本会失败?好像宏名称中多了一个空格。这是错误吗?
答案1
visualization depends on
当点的可视化不仅仅依赖于 时,会使用point meta
。由于您的\addplot
只有一个点,因此它在这里并不适用,尽管它确实有效。- 请查看带有和不带有 的代码visualization depends on
。
不起作用的是你的循环 - 请参阅手册中第 8.1 节有关的内容\pgfplotsinvokeforeach
。- 以及 @Qrrbrbirlbel 在你链接的问题中的评论
这里的问题是 PGFPlots 不会直接“执行” \addplots(或者至少不会全部执行),而是缓存内容以供以后使用。此时 \C 不再定义(因为 \foreach 对其主体进行分组)或 \C 只是最后一项(当使用不对其主体进行分组的循环时)。
\documentclass[tikz, border=1cm]{standalone}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\begin{axis}
%\foreach \A / \B / \C in {1/100/g, 2/200/h}
\newcommand{\A}{1}
\newcommand{\B}{100}
\newcommand{\C}{g}
\addplot[
mark=diamond*,
%visualization depends on=value \C, %this also works
nodes near coords=\C
] coordinates {(\B, \A)};
\end{axis}
\end{tikzpicture}
\end{document}