尝试将数据点的值添加到数据点上方时,我遇到了两个问题。我尝试使用 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}