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

时间:2016-05-08 12:48:51

标签: matlab plot label scale contourf

我想要显示一些数据作为等值线对应的值(矩阵 Z )和标记的countours。我就是这样做的:

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

这是我的结果:

image

我的问题是:如何在轮廓上找到正确的标签?我不想要here所述的颜色条。

修改:这是我的例子:

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

我的真实数据如下所示: true

我可以设置我想要的任何countour行标签,但由于我的数据是指数的,所以它们不会被看到(顺便说一下,这个图中可见的标签是真的,是我的想要进入下一个情节。)

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

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

以下是我的照片的样子: logdtata

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

  1. 0:5:45 - 我会得到我现在所拥有的。
  2. 10 ^ [0:5:45](我希望这些标签)。但是现在我的绘图数据是(0,45)(因为我计算了它的对数)。因此,大多数标签都不会被显示(它们超出数据范围),而且将会放错位置。
  3. 理想情况下,我希望能够做到这样的事情:

    {{1}}

    并使用标签10,10 ^ 5,10 ^ 10等获取底部的图片

    总结一下,我需要做以下其中一项:

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

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

    4.   

1 个答案:

答案 0 :(得分:2)

虽然不可能通过调用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);

enter image description here

现在,如果您看到tl的说明,您会发现它是Data对象,包含TextLine个元素。

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

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

最后,最后一步是循环使用这些数字并将数字N替换为1EN

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

瞧!

enter image description here