5

我有一些数据要显示为等值线图,其中包含值的对数刻度(矩阵Z)和标记的计数。我就是这样做的:

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

这是我的结果:

图片

我的问题是:如何在轮廓上获得正确的标签?我不想要这里描述的彩条。

编辑:这是我的例子:

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. 找到一种以编程方式设置对数刻度的方法,让 matlab 担心等值线。

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

4

1 回答 1

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

在此处输入图像描述

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

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

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

最后,最后一步是遍历这些并将数字替换N1EN

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

瞧!

在此处输入图像描述

于 2016-05-09T09:00:30.967 回答