use*_*748 5 matlab plot label scale contourf
我有一些数据要显示为等高线图,其中包含值的对数刻度(矩阵Z)和标记的计数。这就是我的做法:
[C, h1] = contourf(X, Y, log(Z));
clabel(C,h1);
Run Code Online (Sandbox Code Playgroud)
这是我的结果:
我的问题是:如何在轮廓上获得正确的标签?我不想要这里描述的颜色条。
编辑:这是我的例子:
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);
Run Code Online (Sandbox Code Playgroud)
我可以设置我想要的任何计数线标签,但它们将不可见,因为我的数据是指数级的(顺便说一下,在这个图中可见的标签是真实的,我想在下一个情节)。
现在,由于我的数据是指数形式,我必须在显示值(矩阵 Z)上使用对数刻度来正确显示数据。这是我的方法(也许还有另一种更好的方法,我不知道,我还没有找到其他任何东西):
[C, h1] = contourf(X, Y, log(Z));
clabel(C,h1);
Run Code Online (Sandbox Code Playgroud)
现在看起来不错——你可以看到我的数据是如何变化的。然而,标签是错误的。我现在可以将它们设置为您喜欢的任何向量:
理想情况下,我希望能够像这样:
[C, h1] = contourf(X, Y, Z, 'ZScale', 'Log');
clabel(C,h1);
Run Code Online (Sandbox Code Playgroud)
并在底部获取带有标签 10、10^5、10^10 等的图片。
总而言之,我需要执行以下操作之一:
找到一种以编程方式设置对数刻度的方法,让 matlab 担心等值线。
能够在不移动它们的情况下手动更改等值线上的标签(new_label = 10^old_label)。
一点“黑客”将会起作用,尽管不可能通过调用来使标签保持良好状态clabel(C,h1):
第一步是计算等高线的值。你说你希望它们被放置在1,10,...等等,所以你只需要找到比数据最大值大的 10 的第一个幂:
nextpow10Z=ceil(log10(max(Z(:))));
Run Code Online (Sandbox Code Playgroud)
现在contourf使用轮廓线值向量进行调用:
[C,h1]=contourf(X,Y,log10(Z),1:nextpow10Z);
Run Code Online (Sandbox Code Playgroud)
现在我们需要使用 clabel 的另一种语法,而不是调用clabel(C,h1);,它允许我们循环文本(降级是它们会不太漂亮):
tl=clabel(C);
Run Code Online (Sandbox Code Playgroud)
现在,如果您查看 的描述tl,您会发现它是一个Data对象,包含Text和Line元素。
下一步包括选择包含在中的 Type Text 的所有元素tl:
TextElements=findobj(tl,'Type','Text');
Run Code Online (Sandbox Code Playgroud)
最后,最后一步是循环这些并将数字替换N为1EN:
for i=1:length(TextElements)
TextElements(i).String=strcat('1E',TextElements(i).String);
end
Run Code Online (Sandbox Code Playgroud)
瞧!