如何自定义等高线标签?

How to customize contour line labels?

我想使用 Octave 在等高线图中可视化两个变量的函数,并在其上放置自定义的线标签。

基于 Octave 文档,我写道:

clf;
colormap ("default");
[x, y, z] = peaks ();
subplot(2,1,1);
contour (x, y, z,'showtext', 'on');
title ({"contour() plot, showtext on"; "Z = peaks()"});
subplot(2,1,2);
[ctr, h] = contour (x, y, z);
cll = clabel(ctr, h, 'backgroundcolor',[1 1 1]);
title ({"contour() plot, using clabel()"; "Z = peaks()"});

这会产生两个仅略有不同(如果有的话)不同的图。标签在那里,但一点也不好看;这个项目我需要更好的质量。

我想做的是,按照优先顺序:

  1. 仅显示 2 - 3 位小数位的标签。
  2. 将标签背景更改为白色。
  3. 绘制与等高线一致的标签。

从 Octave 文档看来,标签值存储在 "userdata" 中,但这没有太大帮助,因为:

>> get(cll, "userdata")
ans =
{
  [1,1] =  6.7459
  [2,1] =  5.4167
  [3,1] =  5.4167
  [4,1] =  4.0874
  [5,1] =  4.0874
  [6,1] =  2.7581
  [7,1] =  2.7581
  [8,1] =  2.7581
  [9,1] =  2.7581
  [10,1] =  1.4289
  [11,1] =  1.4289
  [12,1] =  1.4289
  [13,1] =  1.4289
  [14,1] =  0.099636
  [15,1] =  0.099636
  [16,1] =  0.099636
  [17,1] =  0.099636
  [18,1] =  0.099636
  [19,1] =  0.099636
  [20,1] = -1.2296
  [21,1] = -1.2296
  [22,1] = -1.2296
  [23,1] = -1.2296
  [24,1] = -2.5589
  [25,1] = -2.5589
  [26,1] = -2.5589
  [27,1] = -3.8881
  [28,1] = -5.2174

我不确定一个值的重复次数是如何确定的。 我很感激在这件事上的帮助。

要显示数字较少的标签,最好的方法是手动指定在哪些 z 值处绘制等高线(请参阅 contourc 文档中的说明):

colormap('default');
[x, y, z] = peaks();
vn = ceil(min(z(:))):floor(max(z(:))); % list of all integer values within range of data
contour(x, y, z, vn, 'showtext', 'on');
title({"contour() plot, showtext on"; "Z = peaks()"});

您还可以指定要在哪些等高线上放置标签:

colormap('default');
[x, y, z] = peaks();
vn = ceil(min(z(:))):floor(max(z(:)));
[ctr, h] = contour(x, y, z, vn);
clabel(ctr, h, vn(1:2:end), 'backgroundcolor',[1 1 1]);
title({"contour() plot, showtext on"; "Z = peaks()"});

我这里没有 Octave,但 'background color' 参数应该可以发挥作用。线条可能绘制在文本之上,而不是文本绘制在线条之上。 MATLAB 有一个命令uistack 来强制绘制顺序,但这在Octave 中似乎不存在。在那里,one possibility 可能是更改轴对象的子对象的顺序:

set(gca,'children',flip(get(gca,'children')))

(注意:MATLAB 的 contour 在选择漂亮的轮廓级别方面做得更好,而且默认情况下它还会打断标签所在的线,因此线和文本不会相交。)

好吧,我采纳了你的建议,并对我的真实数据进行了更多修改,得到了这个图:

除了情节左侧那个孤独的“0.09”外,这对我的需求很好。那不应该在那里,但我不知道为什么会出现。

set(gca,'children',flip(get(gca,'children'))) 行不通。