pgfplots:“可视化取决于”仅在分配新的宏名时才有效

pgfplots:“可视化取决于”仅在分配新的宏名时才有效

使用旧版本的简化版本回答作为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}

具有单个点和标签的图形

相关内容