如何生成非线性色图/彩条?

时间:2013-12-16 14:55:55

标签: matlab matlab-figure colorbar colormap

我想在第一张图片中显示非均匀颜色条。我试过下面的代码。 'mycamp4'是手动保存的色彩映射。结果显示为第二个数字。数字0.11.5也会过于封闭。如何在第一张图片中制作彩条?

v = [0.1 1 1.5 5 7.5 10 30];
v_2 = [0.1 1.5 5 7.5 10 30];
contourf(X,Y,pdf_normal',v);
h = colorbar;
load('MyColormaps','mycmap4');
set(gcf,'Colormap',mycmap4);
set(h, 'YTick', v_2)

图片1:

enter image description here

图片2:

enter image description here

4 个答案:

答案 0 :(得分:9)

这是一步一步解释。

首先考虑以下示例:

[X,Y,Z1] = peaks;

figure(1)
[~,h1] = contourf(X,Y,Z1,20);
a1 = colorbar;
colormap(jet)
caxis([-6,6])

将为您提供以下图表:

enter image description here

它具有线性数据和线性色图。现在我想缩放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])

enter image description here

现在我们有非线性数据,但仍然是线性colormapcolorbar

到目前为止,所有内容都是为了生成与您类似的示例数据。


现在的答案是:

获取你的情节数据:

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-Ticksscale it with the inverse function,就像您的数据一样:

ticks = get(a3,'YTick');
ticks = scalefactor(ticks);

设置这些反向缩放的颜色条标记:

set(a3,'YTickLabel',ticks)

你终于得到了一个看似线性化的图(但你可以从之前备份你的非线性数据),带有非线性色图和彩条标记。

enter image description here

正如预期的那样,情节看起来与第一个示例中的情况相同,但是使用缩放的颜色条轴。

如果您没有任何功能关系,请尝试获取一个,例如使用曲线拟合工具箱。

答案 1 :(得分:1)

您可以自定义颜色条和颜色条中的刻度,但颜色条本身是基于线性间隔,您无法改变它。

虽然有一种解决方法。

假设您想要像图1中的颜色条那样具有N个非线性区间(例如,color_limits = [1 2 20],如果N = 2)。 你必须:

1)为您的数据定义另一个变量。 e.g。

data2 = nan(size(data));
for i=1:N
   b = data>color_limits(i) & data>=color_limits(i+1);
   data2(b) = i-0.5;
end

基本上,您使用color_limits中的间隔将数据合并到您将显示的不同变量data2中

2)制作数据图像2

3)定义颜色条限制:caxis([0 N])

4)定义具有N种颜色的色彩图,例如颜色表(喷射(N))

5)自定义颜色栏中的刻度

答案 2 :(得分:0)

当您尝试doc colorbar时,您会找到对色彩映射的引用。在尝试doc colormap之后,他们基本上给出了3个选项来设置颜色图。

  1. 输入地图(例如,由get获得的地图或之前设计的地图,这是您尝试过的地图)
  2. 使用属性编辑器选择内置色彩映射。
  3. 使用可从编辑>访问的色彩映射编辑器;图菜单上的色彩图。
  4. @horchler已经提到了它,但我认为你之前没有听说过colormap editor。因此我怀疑选项3最适合你。

答案 3 :(得分:0)

一个人可以尝试Recolor_contourf。它还有两个功能并且易于使用。 在其帮助下给出的示例如下。该功能由我提交。让我知道是否遇到任何问题

X=1:10;Y=1:10;
C=rand(10,10)*150;
c=colormap(jet(7));
L=[10 20 50 60 70 100];
[cdd hc]=contourf(X,Y,C,[-5 L]);
Recolor_contourf(hc,c,L,'vert');