以下是逐步说明。
首先请看以下示例:
[X,Y,Z1] = peaks;
figure(1)
[~,h1] = contourf(X,Y,Z1,20);
a1 = colorbar;
colormap(jet)
caxis([-6,6])
将会给你以下绘图结果:
![enter image description here](https://istack.dev59.com/0r6Lx.webp)
该图具有线性数据和线性颜色映射。现在我想要将Z
数据缩放,使其像您的情况一样变为非线性。我选择了简单的对数据进行平方操作。
Z2 = get(h1,'ZData');
scalefactor = @(x) sign(x).*x.^2;
Z2 = scalefactor(Z2);
这是实际的示例数据,与您的类似:
figure(2)
[~,h2] = contourf(X,Y,Z2,20);
a2 = colorbar;
colormap(jet)
caxis([-6^2,6^2])
![这里输入图片描述](https://istack.dev59.com/pNkk4.webp)
我们现在有非线性数据,但仍然使用线性的colormap
和colorbar
。
到目前为止,一切都是为了生成类似于您的示例数据。
现在是真正的答案:
获取绘图的数据:
Z3 = get(h2,'ZData');
并使用您希望更多或更少了解的关系来扩展它:
descalefactor = @(x) sign(x).*abs(x).^(1/2);
Z3 = descalefactor(Z3);
绘制已缩放数据的图表:
figure(3)
[~,h3] = contourf(X,Y,Z3,20);
a3 = colorbar;
colormap(jet)
caxis([-6,6])
获取 Y 轴刻度值
并使用其反函数进行缩放,就像您的数据一样:
ticks = get(a3,'YTick');
ticks = scalefactor(ticks);
设置这些反比例缩放的颜色条刻度。
set(a3,'YTickLabel',ticks)
现在,你最终得到了一条看似线性的图表(但你可以备份之前的非线性数据),并且还有一个非线性的颜色映射和颜色条刻度。
![enter image description here](https://istack.dev59.com/9SXkD.webp)
正如预期的那样,这个图表看起来和第一个例子中的一样,只是颜色条轴被缩放了。
如果你没有任何函数关系,请尝试获取一个,例如使用曲线拟合工具箱。
colorbar
通常只显示colormap
的内容。我猜你已经尝试过colormapeditor
了。你应该在文件交换平台上搜索自定义色图。 - horchler