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

我有一些数据要显示为轮廓图,其值为对数刻度(矩阵Z)和标记的countours.我是这样做的:

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

这是我的结果:

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

我的问题是:如何在轮廓上找到正确的标签?我不想要像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);

我的真实数据如下所示:
《Matlab:如何在coutour图上设置对数刻度》

我可以设置我想要的任何countour行标签,但是因为我的数据是指数的,所以它们将不可见(顺便说一下,这个图中可见的标签是真实的,我想要的是下一个情节).

现在,由于我的指数数据,我必须在显示的值(矩阵Z)上使用对数刻度来正确显示数据.我是这样做的(也许还有另一个更好的方法,我不知道,我还没有找到其他的东西):

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

这是我的图片的样子:
《Matlab:如何在coutour图上设置对数刻度》

它看起来很好 – 你可以看到我的数据如何变化.但是,标签是错误的.我现在可以将它们设置为你喜欢的任何矢量:

> 0:5:45 – 我会得到我现在拥有的.
> 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(C,h1);而是使用另一种clabel语法,它允许我们循环通过文本(降级是它们不那么漂亮):

tl=clabel(C);

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

现在,如果你看到tl的描述,你会发现它是一个Data对象,包含Text和Line元素.

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

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

最后,最后一步是循环遍历这些并用1EN替换数字N:

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

瞧!

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

点赞