【问题标题】:How can I display a log scale colorbar with Matlab R2015a?如何使用 Matlab R2015a 显示对数刻度颜色条?
【发布时间】:2017-07-30 09:48:32
【问题描述】:

我正在尝试在 Matlab 中使用函数 surf 显示 3D 图,并且我需要它在 z 轴的对数刻度中。所以这就是我正在做的事情:

surf(X,Y,Z)
set(gca,'zscale','log')

但我希望颜色条以对数刻度显示,标签为 10^(-6)、10^(-5)、10^(-4)、...

查了一下,找到了解决办法

h = colorbar
set(h,'YScale','log')

但它不适用于最新版本的 Matlab,因为 'YScale' 参数不再存在。

有什么想法吗?

非常感谢。

【问题讨论】:

    标签: matlab matlab-figure surface colorbar


    【解决方案1】:

    即使您可以将颜色条轴和标签更改为对数刻度,您的数据仍然不是对数刻度,因此颜色条会显得很奇怪。为了解决这个问题,我可以建议使用另一个虚拟轴来固定颜色条。方法如下:

    假设你绘制了这个:

    [X,Y,Z] = peaks(50);
    s = surf(X,Y,Z);
    set(gca,'zscale','log')
    h = colorbar;
    

    我们的下一步是在插入颜色条后获取坐标轴位置(以备将来使用):

    axpos = s.Parent.Position;
    

    现在我们创建新轴,隐藏它们,并在第一个轴的相同位置添加一个颜色条:

    axes;
    axis off
    cb = colorbar('Position',h.Position);
    

    接下来我们将 colobar 轴调整为图中显示的值(因为不显示 Z<=0):

    caxis(log10([min(Z(Z>0)) max(Z(:))]))
    

    我们将颜色条刻度标签更改为对数刻度格式:

    cb.TickLabels = sprintf('10^{%1.1f}\n',cb.Ticks);
    

    最后,我们删除第一个颜色条,并将坐标轴位置设置回axpos

    delete(h)
    set(s.Parent,'Position',axpos)
    

    我们得到:

    【讨论】:

    • 非常感谢!我明白了,但是,在运行与您完全相同的代码时,我收到“axpos = s.Parent.Position”行的错误。 Matlab 告诉我“尝试引用非结构数组的字段”。知道可能是什么问题吗?
    • @MarieC 你说得对。我有一个小错字,应该是s = surf(X,Y,Z);。现已更正。
    【解决方案2】:

    MATLAB forum中的类似问题。

    要点:您可以获取caxis 并将其修改为log 值:

    caxis(log([c(1) c(length(c))]));
    colorbar('FontSize',11,'YTick',log(c),'YTickLabel',c);
    

    【讨论】:

    • 谢谢,但我不知道在我的情况下向量 c 是什么...我只是在绘制两个变量的函数
    • c 是您的数据向量,因为颜色条限制是从那里得出的。
    猜你喜欢
    • 1970-01-01
    • 2018-01-15
    • 2019-12-23
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多