我有一些数据要显示为轮廓图,其值为对数刻度(矩阵Z)和标记的countours.我是这样做的:
[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);
我可以设置我想要的任何countour行标签,但是因为我的数据是指数的,所以它们将不可见(顺便说一下,这个图中可见的标签是真实的,我想要的是下一个情节).
现在,由于我的指数数据,我必须在显示的值(矩阵Z)上使用对数刻度来正确显示数据.我是这样做的(也许还有另一个更好的方法,我不知道,我还没有找到其他的东西):
[C, h1] = contourf(X, Y, log(Z));
clabel(C,h1);
它看起来很好 – 你可以看到我的数据如何变化.但是,标签是错误的.我现在可以将它们设置为你喜欢的任何矢量:
> 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等获取底部的图片.
总结一下,我需要做以下其中一项:
Find a way to set the logarithmic scale programmatically and let matlab worry about the isolines.
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);
现在,如果你看到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
瞧!