具有不同颜色图matlab的子图

Posted

技术标签:

【中文标题】具有不同颜色图matlab的子图【英文标题】:subplots with different colormaps matlab 【发布时间】:2015-01-09 15:29:47 【问题描述】:

我正在尝试使用两个不同的轮廓子图制作一个图表,这些子图使用完全不同的颜色图。但是,使用我目前拥有的代码(为其中一个子图创建自定义颜色图),子图具有相同的颜色图。任何想法如何解决这个问题?

h = figure;
subplot(2,1,1)
title('GEFS 20 Member Mean Vorticity');
axesm('eqdcylin','maplonlimit',[-180 179],'maplatlimit',[0 90]);
%eqdcylin
contourm(gLat, gLon, squeeze(meanhx(x,:,:))', 16,'Color',[0.05 0.05 0.05],'LineWidth',2);
hold on
contourfm(gLat, gLon, squeeze(vmeanx(x,:,:))', 30, 'LineStyle', 'none'); 
shading flat;
lm=worldlo('POline');
  for i=1:length(lm);
  lm(i).otherproperty = 'color','m','LineWidth',1.5;
  end
displaym(lm);
gridm on;
tightmap;
set(h, 'Position', [1 1 2200 1100]);
colormap(b2r(-5*10^-5, 5*10^-5));
freezeColors;
cbfreeze(colorbar)




%caxis([-5*10^-5 5*10^-5])

colorbar;


subplot(2,1,2)
title('GEFS 20 Member Vorticity Variance');
axesm('eqdcylin','maplonlimit',[-180 179],'maplatlimit',[0 90]);
%eqdcylin
contourm(gLat, gLon, squeeze(meanhx(x,:,:))', 16,'Color',[0.05 0.05 0.05],'LineWidth',2);
hold on
contourfm(gLat, gLon, squeeze(vvarx(x,:,:))', 30, 'LineStyle', 'none'); 
shading flat;
lm=worldlo('POline');
  for i=1:length(lm);
  lm(i).otherproperty = 'color','m','LineWidth',1.5;
  end 
displaym(lm);
gridm on;
tightmap;
set(h, 'Position', [1 1 2200 1100]);

mycmap = [
0.9961    0.9961    0.9961;
0.6641    0.6641    0.9974;
0.3320    0.3320    0.9987;
     0         0    1.0000;
     0    0.2500    1.0000;
     0    0.5000    1.0000;
     0    0.7500    1.0000;
     0    1.0000    1.0000;
0.2000    1.0000    0.8000;
0.4000    1.0000    0.6000;
0.6000    1.0000    0.4000;
0.8000    1.0000    0.2000;
1.0000    1.0000         0;
1.0000    0.9333         0;
1.0000    0.8667         0;
1.0000    0.8000         0;
1.0000    0.7333         0;
1.0000    0.6667         0;
1.0000    0.6000         0;
1.0000    0.5333         0;
1.0000    0.4667         0;
1.0000    0.4000         0;
1.0000    0.3333         0;
1.0000    0.2667         0;
1.0000    0.2000         0;
1.0000    0.1333         0;
1.0000    0.0667         0;
1.0000         0         0;
0.9854         0         0;
0.9708         0         0;
0.9561         0         0;
0.9415         0         0;
0.9269         0         0;
0.9123         0         0;
0.8977         0         0;
0.8830         0         0;
0.8684         0         0;
0.8538         0         0;
0.8392         0         0;
0.8246         0         0;
0.8099         0         0;
0.7953         0         0;
0.7807         0         0;
0.7661         0         0;
0.7515         0         0;
0.7368         0         0;
0.7222         0         0;
0.7092         0         0;
0.6961         0         0;
0.6830         0         0;
0.6699         0         0;
0.6569         0         0;
0.6438         0         0;
0.6307         0         0;
0.6176         0         0;
0.6046         0         0;
0.5915         0         0;
0.5784         0         0;
0.5654         0         0;
0.5523         0         0;
0.5392         0         0;
0.5261         0         0;
0.5131         0         0;
0.5000         0         0;
];

colormap(mycmap);






freezeColors;
cbfreeze(colorbar);


set(gcf, 'renderer', 'zbuffer');

【问题讨论】:

不是最小的,也不是可复制的;你看过 freezeColors 中的例子了吗? 当然可以,我怎样才能使这个最小化和可重现。 This 与 R 相关,但对 Matlab 和任何编程问题同样有效。谷歌搜索会给你数百次点击。另外看看 SO 的help。 我多次搜索google,并继续返回相同的问题,因为似乎没有直接解决此问题的解决方案。否则我不会在这里问。此外,我不确定究竟是什么导致它无法重现,这里没有什么是不可重现的,而且代码只是一个杂乱的(带有映射线)轮廓图。 解决起来没那么简单,请看这里的解决方案:***.com/a/39741044/2627163 如果你能制作一个我可以运行的独立代码,我会添加 2 个颜色图。 【参考方案1】:

编辑:看来,文档是错误的!见 cmets!

通过使用 colormap 函数的第二个参数,如果您想这样调用它,应该能够将特定的颜色图分配给特定的(子)图或轴:

参考TMW: colormap:

请注意,第一个参数是轴的句柄!

colormap(ax,map)

为 ax 指定的坐标区设置颜色图。一个内的每个轴 figure 可以有一个独特的颜色图。设置坐标区颜色图后, 更改图形颜色图不会影响轴。

如何获取坐标轴的句柄?:

当使用 plot(x,y..) 绘图时,您将其作为返回值。抓住它:

ax = plot(x,y..)

对于您似乎使用的其他绘图功能,您应该在 doku 中找到一些相关信息。

【讨论】:

这是错误的。问题是关于子图中的多个颜色图。以上仅在每个地块位于不同图中时才有效。即使您获得了单个子图的轴句柄,设置其颜色图也会改变图中所有其他轴的颜色图。 天哪,看来你是对的。我刚得到这个表格的文档。我弄错了吗?->“图形中的每个轴都可以有一个唯一的颜色图”还是文档有问题..? :o 显然是的。这很容易测试,data = randi (64, 10); hax1 = subplot (1, 2, 1); image (data); colormap (hax1, jet); hax2 = subplot (1, 2, 2); image (data); colormap (hax2, hot); Mathwork 的解决方案是absolute joke。您必须创建一个颜色图,它是每个子图颜色图的串联,并相应地调整每个颜色图的值。如果你想要颜色条,你也需要手动设置它们的范围。【参考方案2】:

如果您升级到 MATLAB 2017a,您可以使用语法 colormap(axesHandle, cMap) 为每个坐标区对象分配一个颜色图

【讨论】:

【参考方案3】:

如果您有图像处理工具箱,您可以使用函数subimage 来显示带有各自颜色图的图像:

X1=imread('http://upload.wikimedia.org/wikipedia/commons/5/5c/Burosch_Blue-Only_Test_pattern.jpg');
X2=imread('http://upload.wikimedia.org/wikipedia/commons/e/ea/Romsey_River_Test.jpg');
subplot(1,2,1), subimage(X1)
subplot(1,2,2), subimage(X2)

结果:

编辑这个问题有更完整的答案here。

【讨论】:

我没有加载图像,我正在计算轮廓图。这会类似吗? @agold2121 我刚刚意识到它仅适用于图像(即矩阵),请查看链接以了解使用绘图的方法。 @agold2121 freezeColors 没有解决您的问题? 不,它实际上冻结了两个子图的相同颜色。

以上是关于具有不同颜色图matlab的子图的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib 不同大小的子图

次要情节之外的主要人物图例

绘制具有相同颜色的子图线

Python使用matplotlib函数subplot可视化多个不同颜色的折线图为每一个子图添加子图小标题(subtitle)

分组条形图的子图分组图例

Python使用matplotlib函数subplot可视化多个不同颜色的折线图为多个子图添加总标题(main title)