如何使用 Matlab R2015a 显示对数刻度颜色条?

How can I display a log scale colorbar with Matlab R2015a?

我正在尝试在 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 forum 中的类似问题。

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

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

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

假设你绘制了这个:

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

我们得到: