我想要显示一些数据作为等值线对应的值(矩阵 Z )和标记的countours。我就是这样做的:
X = 1:1:20;
Y = X;
Z = zeros(size(Y));
for i = 1:size(Y,2);
Z(i, :) = 10^i;
end
[C, h1] = contourf(X, Y, Z);
clabel(C,h1);
这是我的结果:
我的问题是:如何在轮廓上找到正确的标签?我不想要here所述的颜色条。
修改:这是我的例子:
[C, h1] = contourf(X, Y, log(Z));
clabel(C,h1);
我可以设置我想要的任何countour行标签,但由于我的数据是指数的,所以它们不会被看到(顺便说一下,这个图中可见的标签是真的,是我的想要进入下一个情节。)
现在,由于我的数据处于指数状态,我必须在显示的值(矩阵Z)上使用对数刻度来正确显示数据。我就是这样做的(也许有另一个更好的方式,我不知道,我还没有找到其他的东西):
[C, h1] = contourf(X, Y, Z, 'ZScale', 'Log');
clabel(C,h1);
现在看起来很好 - 你可以看到我的数据是如何变化的。但是,标签是错误的。我现在可以将它们设置为你喜欢的任何矢量:
理想情况下,我希望能够做到这样的事情:
{{1}}
并使用标签10,10 ^ 5,10 ^ 10等获取底部的图片
总结一下,我需要做以下其中一项:
找到一种以编程方式设置对数刻度的方法,让matlab担心等值线。
- 醇>
能够手动更改等值线上的标签而不移动它们(new_label = 10 ^ old_label)。
答案 0 :(得分:2)
虽然不可能通过调用clabel(C,h1)
来保持标签的良好状态,但可以使用一些“黑客”:
第一步是计算轮廓线的值。你说你希望它们放在1,10,...
等等,所以你只需要找到比你的数据最大值大10的第一个幂:
nextpow10Z=ceil(log10(max(Z(:))));
现在使用轮廓线值向量调用contourf
:
[C,h1]=contourf(X,Y,log10(Z),1:nextpow10Z);
现在我们不需要调用clabel(C,h1);
,而是使用另一种clabel语法,它允许我们循环使用文本(降级是因为它们不那么漂亮):
tl=clabel(C);
现在,如果您看到tl
的说明,您会发现它是Data
对象,包含Text
和Line
个元素。
下一步是选择tl
中包含的Type Text的所有元素:
TextElements=findobj(tl,'Type','Text');
最后,最后一步是循环使用这些数字并将数字N
替换为1EN
:
for i=1:length(TextElements)
TextElements(i).String=strcat('1E',TextElements(i).String);
end
瞧!