Matlab:如何在等高线图上设置对数刻度

Matlab: how to set logarithmic scale on the coutour plot

我有一些数据,我想将其显示为具有对数值(矩阵 Z)和标记计数的等高线图。我是这样做的:

[C, h1] = contourf(X, Y, log(Z)); 
clabel(C,h1);

这是我的结果:

我的问题是:如何在轮廓上获得正确的标签?我不想要 here.

中描述的彩条

编辑: 这是我的例子:

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);

我的真实数据是这样的:

我可以设置任何我想要的轮廓线标签,但它们不会可见,因为我的数据是指数级的(顺便说一句,在这个图中可见的标签是真实的,我的想进入下一个情节)。

现在,由于我的数据呈指数形式,我必须在显示值(矩阵 Z)上使用对数刻度才能正确显示数据。这是我的做法(也许还有另一种更好的方法,我不知道,我还没有找到其他方法):

[C, h1] = contourf(X, Y, log(Z)); 
clabel(C,h1);

我的照片是这样的:

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

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

理想情况下,我希望能够做到这样的事情:

[C, h1] = contourf(X, Y, Z, 'ZScale', 'Log'); 
clabel(C,h1);

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

综上所述,我需要执行以下操作之一:

  1. Find a way to set the logarithmic scale programmatically and let matlab worry about the isolines.

  2. Be able to manually change the label on the isolines without moving them (new_label = 10^old_label).

一点点 'Hack' 会起作用,尽管无法像调用 clabel(C,h1) 时那样保持标签的美观:

第一步是计算等高线的值。你说你想把它们放在 1,10,... 等等,所以你只需要找到大于数据最大值的 10 的第一个幂:

nextpow10Z=ceil(log10(max(Z(:))));

现在用等高线值向量调用contourf

[C,h1]=contourf(X,Y,log10(Z),1:nextpow10Z);

现在我们需要使用 clabel 的另一种语法而不是调用 clabel(C,h1);,它允许我们循环遍历文本(降级是它们会不那么漂亮):

tl=clabel(C);

现在,如果您查看 tl 的描述,您会看到它是一个 Data 对象,包含 TextLine 元素。

下一步是选择 tl 中包含的所有类型文本元素:

TextElements=findobj(tl,'Type','Text');

最后,最后一步是遍历这些并将数字 N 替换为 1EN :

for i=1:length(TextElements)
    TextElements(i).String=strcat('1E',TextElements(i).String);
end

瞧!