我正在尝试创建一个轮廓线带有标签的轮廓图。数据从 Octave 导入,并存储在名为 的文件中data.dat
。它包含许多轮廓线,因此手动修改文件不切实际。
以下代码重现了该问题:
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot[contour prepared]
table {
0 2.875 5
3 2.875 5
0 2.825 4
3 2.825 4
0 2.75 3
3 2.75 3
0 2.5 2
3 2.5 2
0 1 1
3 1 1
};
\end{axis}
\end{tikzpicture}
\end{document}
结果是一些轮廓线彼此太近,因此它们的标签会过度叠加。我想通过两种方式自动限制添加到轮廓线的标签数量:
- 那些值大于某个数字的标签将不会出现。例如,在我的示例中,仅显示等高线中值低于 3 的标签。
- 仅显示选定轮廓线的标签。例如,删除等于 4 的标签。
欢迎提供关于使用哪些选项的任何提示,因为我在文档中找不到执行此操作的正确方法。
答案1
Pgfplots目前仅支持激活全部或全部不激活,以及修改同一曲线上相邻标签的距离。
但是,您可以使用 来更改生成此类标签的方式label node code
。这需要您具备一些关于如何比较值的知识。
一个潜在的解决方案可能是
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot[
contour/label node code/.code={%
% Possibility 1: use the *transformed* point meta
% (i.e. relative: 0 = smallest value, 1000=largest)
%
% -> use this to get the first 50% of the labels:
\ifdim\pgfplotspointmetatransformed pt<500pt
\node {\pgfmathprintnumber{##1}};
\else
% Possibility 2: use the *original* point meta
% -> it is in float representation.
%
% -> use this to get specific labels.
\pgfmathfloattofixed{\pgfplotspointmeta}%
%
% \ifdim works only if the |\pgfmathresult| < 16000
% and not too small.
\ifdim\pgfmathresult pt=5pt % get label "5"
\node {\pgfmathprintnumber{##1}};
\fi
\fi
},
contour prepared,
]
table {
0 2.875 5
3 2.875 5
0 2.825 4
3 2.825 4
0 2.75 3
3 2.75 3
0 2.5 2
3 2.5 2
0 1 1
3 1 1
};
\end{axis}
\end{tikzpicture}
\end{document}
我选择在这里使用\ifdim
需要两个维度参数的方法(这就是我添加“pt”作为后缀的原因,这在这里很合适)。还有其他方法可以比较数值,但我想这种方法在这里可以胜任。
我一直想添加更多预定义选项来控制轮廓标签的位置。也许我应该把你的问题当作功能请求并最终实现它。