我想在第一张图片中显示非均匀颜色条。我试过下面的代码。 'mycamp4'是手动保存的色彩映射。结果显示为第二个数字。数字0.1
和1.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:
图片2:
答案 0 :(得分:9)
这是一步一步解释。
首先考虑以下示例:
[X,Y,Z1] = peaks;
figure(1)
[~,h1] = contourf(X,Y,Z1,20);
a1 = colorbar;
colormap(jet)
caxis([-6,6])
将为您提供以下图表:
它具有线性数据和线性色图。现在我想缩放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])
现在我们有非线性数据,但仍然是线性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
和scale it with the inverse function
,就像您的数据一样:
ticks = get(a3,'YTick');
ticks = scalefactor(ticks);
设置这些反向缩放的颜色条标记:
set(a3,'YTickLabel',ticks)
你终于得到了一个看似线性化的图(但你可以从之前备份你的非线性数据),带有非线性色图和彩条标记。
正如预期的那样,情节看起来与第一个示例中的情况相同,但是使用缩放的颜色条轴。
如果您没有任何功能关系,请尝试获取一个,例如使用曲线拟合工具箱。
答案 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个选项来设置颜色图。
get
获得的地图或之前设计的地图,这是您尝试过的地图)答案 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');