我正在尝试使用 tikz 和 pgfplots 在曲线上方放置标签。下面的解决方案产生了预期的输出,但只有当我在编译期间忽略错误消息时才会出现:
Package PGF Error: I cannot decorate an empty path. [ \end{axis}]
这是什么意思?我该如何修复它?显然有一条可见的路径,当我跳过错误时,它确实得到了修饰。以下示例:
\documentclass{article}
\usepackage{tikz}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing}
\usetikzlibrary{decorations.markings}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}
\begin{document}
\pgfmathdeclarefunction{poiss}{1}{%
\pgfmathparse{(#1^x)*exp(-#1)/(x!)}%
}
\begin{tikzpicture}[node distance=10mm]
\begin{axis}[
compat=newest,
ymax=0.16,
xlabel=$k$,
ylabel=$P(k)$,
domain=0:25,samples at = {0,...,25},
label/.style 2 args={%
postaction={ decorate,
decoration={ markings, mark=at position #1 with \node#2;}
}}%
]
\addplot[red,mark=o,%
label={0.45}%
{[above]{$\lambda=10$}}%
] {poiss(10)};
\end{axis}
\end{tikzpicture}
\end{document}
答案1
问题是 似乎mark
与 不兼容decorate
。如果您绘制两次图,一次带有标记,一次带有装饰,它就会起作用。
(奖励:这还展示了如何向[]
作为装饰放置的节点添加参数;我遇到了困难,因为它无法解析[above,yshift=-4pt]
。您可以在外部定义样式,如下所示。或者您可以说,但这似乎仅在节点的参数中\node [above][blue]
没有,
和时才有效。)=
\documentclass{article}
\usepackage{tikz}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing}
\usetikzlibrary{decorations.markings}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}
\begin{document}
\pgfmathdeclarefunction{poiss}{1}{%
\pgfmathparse{(#1^x)*exp(-#1)/(x!)}%
}
\tikzstyle{higherabove}+=[above,yshift=4pt]
\begin{tikzpicture}[node distance=10mm]
\begin{axis}[
compat=newest,
ymax=0.16,
xlabel=$k$,
ylabel=$P(k)$,
domain=0:25,samples at = {0,...,25},
mylabel/.style n args={2}{%
postaction={decorate},%
decoration={markings,%
mark=at position #1 with \node [higherabove] {#2}; }%
}%
]
\addplot[red,mark=o] {poiss(10)};
\addplot[red,mylabel={0.45}{hello} ] {poiss(10)};
\end{axis}
\end{tikzpicture}
\end{document}
答案2
PGFPlots 提供了一种本机方法来向图添加标签,而无需借助于库decorations
:只需添加node [pos=..., <options>] {text};
到\addplot
命令中:
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\pgfmathdeclarefunction{poiss}{1}{%
\pgfmathparse{(#1^x)*exp(-#1)/(x!)}%
}
\begin{tikzpicture}
\begin{axis}[
compat=newest,
ymax=0.16,
xlabel=$k$,
ylabel=$P(k)$,
domain=0:25,samples at = {0,...,25}
]
\addplot[red, mark=o] {poiss(10)} node [pos=0.4, above=4pt] {hello};
\end{axis}
\end{tikzpicture}
\end{document}