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

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

以下是我的真实数据:

true

我可以设置任何等高线标签,但由于我的数据是指数级别的(另外,在这个图中可见的标签是真实的,在下一个图中想要得到的),它们不会显示出来。

现在,由于我的数据是指数级别的,我必须使用对数刻度来正确显示矩阵Z中的数据。以下是我如何做到的(也许还有其他更好的方法,但我不知道,我没有找到其他的):

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

这是我的图片展示:

logdtata

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

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


@Yvon,那怎么能帮到我呢?我不想要任何额外的标签 - 我只想更改轮廓中已有的标签。根据文档,等高线图没有ytick属性(http://www.mathworks.com/help/matlab/ref/contour-properties.html)。 - user2738748
你在说哪些标签?是由 clabel 绘制的那些吗? - BillBokeey
2
我的意思是你绿色图表中的数字看起来很自然。因为你将 log(Z) 传递给外部函数,所以这些数字是没有基数的指数。我建议你不要改变任何东西,因为写 10^-5-5 没有区别,但会占用更多的空间。在命令窗口中打印 log(Z) 并查看。 - Yvon
1
正确的计算10的对数函数是log10 - Yvon
1
如果我理解正确的话,您不要忽略我的“log10”评论。 - Yvon
显示剩余10条评论
1个回答

2

一个小的“技巧”,虽然无法像调用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);

enter image description here

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

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

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

最后一步是循环这些数字,将N替换为1EN。请注意保留HTML标签。
for i=1:length(TextElements)
    TextElements(i).String=strcat('1E',TextElements(i).String);
end

完成了!

这是图片描述


请看一下我的编辑。你第二个图中的比例尺不是对数的。对数意味着绘制以下等值线:1、10、100、1000。此外,我不想改变等值线的位置,我要么能够设置我的值的对数刻度,要么欺骗并在我的图中重新命名等值线。 - user2738748

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接