5

我想在第一张图片中显示一个不均匀的颜色条。我已经尝试了下面的代码。'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:

在此处输入图像描述

图二:

在此处输入图像描述

4

4 回答 4

10

这里一步一步解释。

首先考虑以下示例:

[X,Y,Z1] = peaks;

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

这将为您提供以下情节:

在此处输入图像描述

它具有线性数据和线性颜色图。现在我想缩放Z-Data 以使其像您的情况一样非线性。我选择了一个简单的数据平方。

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

在此处输入图像描述

现在我们有非线性数据,但仍然是线性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-Ticksand scale it with the inverse function,就像您的数据一样:

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

设置这些反向缩放的颜色条刻度:

set(a3,'YTickLabel',ticks)

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

在此处输入图像描述

正如预期的那样,该图看起来与第一个示例中的相同,但具有缩放的颜色条轴。

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

于 2013-12-17T09:03:13.547 回答
1

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

不过有一个解决方法。

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

1)为您的数据定义另一个变量。例如

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)制作你的data2图像

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

4) 定义具有 N 个颜色的颜色图,例如 colormap(jet(N))

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

于 2015-02-03T16:16:26.910 回答
0

当您尝试时,doc colorbar您会发现对颜色图的引用。在尝试之后,doc colormap他们基本上提供了 3 个选项来设置颜色图。

  1. 输入一张地图(例如一张由get之前获得或设计的一张,这是你尝试过的)
  2. 使用属性编辑器选择内置颜色图。
  3. 使用颜色图编辑器,可从图形菜单上的编辑 > 颜色图访问。

@horchler 已经提到过它,但我假设您以前没有听说过颜色图编辑器。因此,我怀疑选项 3 最适合您。

于 2013-12-16T16:32:27.403 回答
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');
于 2018-07-18T06:49:42.733 回答