PGFPlot 轴环境中的循环/在数据点上方添加值

PGFPlot 轴环境中的循环/在数据点上方添加值

尝试将数据点的值添加到数据点上方时,我遇到了两个问题。我尝试使用 for 循环来解决这个问题:

\documentclass[12pt]{article}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\begin{document}

\begin{tikzpicture}
\def \myvalues{{50,50,31,25,24,24,24,24,24,24,24,24,24,24,24}}%


\begin{axis}[
    width=\textwidth,
    height=.40\textwidth,
    xlabel={x},
    ylabel={y},
    xtick={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},
    ytick={20,25,30,35,40,45,50},
    xmajorgrids,
    ymajorgrids,
]
\addplot [black, mark=*, mark options={solid}]
table {%
1 50
2 50
3 31
4 25
5 24
6 24
7 24
8 24
9 24
10 24
11 24
12 24
13 24
14 24
15 24
};

 \pgfplotsinvokeforeach{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}{
        \pgfmathparse{\myvalues[#1-1]};
    \node at (#1,\pgfmathresult+2){\pgfmathresult};
    }

\end{axis}


\end{tikzpicture}
\end{document}

问题:

  • 文档编译时没有错误,但是节点没有显示在图中。
  • 如何在 for 循环中添加 if 语句?例如,将节点 4 和 12 的颜色更改为红色?

多谢! -

答案1

查看回答另一个问题(以及其他问题)。

总结:pgfplots不会在您认为执行命令时执行命令,而是将其推迟。此时\pgfmathresult不再包含计算结果。但是,您可以通过定义临时宏来强制扩展。请注意,在这种情况下,任何 tikz 命令(\node\fill\draw、...)都需要受到 的保护\noexpand

以下代码有效:

\documentclass[12pt]{article}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\begin{document}

\begin{tikzpicture}
\def \myvalues{{50,50,31,25,24,24,24,24,24,24,24,24,24,24,24}}%


\begin{axis}[
    width=\textwidth,
    height=.40\textwidth,
    xlabel={x},
    ylabel={y},
    xtick={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},
    ytick={20,25,30,35,40,45,50},
    xmajorgrids,
    ymajorgrids,
]
\addplot [black, mark=*, mark options={solid}]
table {%
1 50
2 50
3 31
4 25
5 24
6 24
7 24
8 24
9 24
10 24
11 24
12 24
13 24
14 24
15 24
};

 \pgfplotsinvokeforeach{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}{
        \pgfmathparse{\myvalues[#1-1]};
        \edef\temp{
            \noexpand\node at (#1,\pgfmathresult+2){\pgfmathresult};
        }
        \temp
    }

\end{axis}


\end{tikzpicture}
\end{document}

相关内容