Matlab:如何在 coutour 图上设置对数刻度

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)

这是我的照片的样子: 日志数据

现在看起来不错——你可以看到我的数据是如何变化的。然而,标签是错误的。我现在可以将它们设置为您喜欢的任何向量:

  1. 0:5:45 - 我会得到我现在所拥有的。
  2. 10^[0:5:45](我想要这些标签)。但是现在我绘制的数据范围是(0, 45)(因为我计算了它的对数)。因此,大多数标签将不会显示(它们超出数据范围),并且会放错位置的标签。

理想情况下,我希望能够像这样:

[C, h1] = contourf(X, Y, Z, 'ZScale', 'Log'); 
clabel(C,h1);
Run Code Online (Sandbox Code Playgroud)

并在底部获取带有标签 10、10^5、10^10 等的图片。

总而言之,我需要执行以下操作之一:

  1. 找到一种以编程方式设置对数刻度的方法,让 matlab 担心等值线。

  2. 能够在不移动它们的情况下手动更改等值线上的标签(new_label = 10^old_label)。

Bil*_*eey 2

一点“黑客”将会起作用,尽管不可能通过调用来使标签保持良好状态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对象,包含TextLine元素。

下一步包括选择包含在中的 Type Text 的所有元素tl

TextElements=findobj(tl,'Type','Text');
Run Code Online (Sandbox Code Playgroud)

最后,最后一步是循环这些并将数字替换N1EN

for i=1:length(TextElements)
    TextElements(i).String=strcat('1E',TextElements(i).String);
end
Run Code Online (Sandbox Code Playgroud)

瞧!

在此输入图像描述