等高线图中的等高线标签过多

等高线图中的等高线标签过多

我正在尝试创建一个轮廓线带有标签的轮廓图。数据从 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}

结果是一些轮廓线彼此太近,因此它们的标签会过度叠加。我想通过两种方式自动限制添加到轮廓线的标签数量:

  1. 那些值大于某个数字的标签将不会出现。例如,在我的示例中,仅显示等高线中值低于 3 的标签。
  2. 仅显示选定轮廓线的标签。例如,删除等于 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”作为后缀的原因,这在这里很合适)。还有其他方法可以比较数值,但我想这种方法在这里可以胜任。

我一直想添加更多预定义选项来控制轮廓标签的位置。也许我应该把你的问题当作功能请求并最终实现它。

相关内容