如何自定义等高线标签?
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()"});
这会产生两个仅略有不同(如果有的话)不同的图。标签在那里,但一点也不好看;这个项目我需要更好的质量。
我想做的是,按照优先顺序:
- 仅显示 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')))
行不通。
我想使用 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()"});
这会产生两个仅略有不同(如果有的话)不同的图。标签在那里,但一点也不好看;这个项目我需要更好的质量。
我想做的是,按照优先顺序:
- 仅显示 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')))
行不通。