Matplotlib - 具有不同范围的两个不同色图

5
我正在尝试合并之前分开的两个图形。 其中一个是3面板图(ax1、ax2、ax3)(都是使用imshow生成的),我在一侧使用单一的色标。现在,我想添加另一个图形(ax0),它是通过imreadmatplotlib.cbook中的get_sample_data从png文件加载的。
问题在于,新添加的面板所采用的色标与三面板图中的相同,因此在新添加的面板中呈现出一种简单的均匀颜色。而其他三个面板仍然具有正确的颜色。
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np

g1 = gridspec.GridSpec(4, 1, height_ratios=[4,1,1,1])
g1.update(wspace=0.05, hspace=0.2) # set the spacing between axes.

f, ((ax0), (ax1), (ax2), (ax3)) = plt.subplots(4, 1, sharex='col', sharey='row')

ax0 = subplot(g1[0])
ax1 = subplot(g1[1])
ax2 = subplot(g1[2])
ax3 = subplot(g1[3])

from matplotlib.cbook import get_sample_data
im2 = plt.imread(get_sample_data('PathToFig/Figure.png'))
ax0.imshow(im2, vmax=1)

ziAA = np.random.rand(4, 4, 4)
ziAB = np.random.rand(4, 4, 4)
ziBA = np.random.rand(4, 4, 4)

ax1.imshow(ziAA,origin="lower",vmin=0,vmax=0.03,aspect="auto",extent=[-0.15,0.15,0,4])
ax2.imshow(ziAB,origin="lower",vmin=0,vmax=0.03,aspect="auto",extent=[-0.15,0.15,0,4])
im = ax3.imshow(ziBA,origin="lower",vmin=0,vmax=0.03,aspect="auto",extent=[-0.15,0.15,0,4])

from matplotlib import ticker
tick_locator = ticker.MaxNLocator(nbins=5)

f.subplots_adjust(right=0.85)

cbar_ax = f.add_axes([1.0, 0.15, 0.01, 0.7])
cbar = f.colorbar(im, cax=cbar_ax)

cbar.locator = tick_locator
cbar.update_ticks()
cbar.solids.set_rasterized(True)
cbar.solids.set_edgecolor("face")

ziABziBAziAA是在之前的griddata插值调用中生成的。

我尝试在每个imshow调用中指定两个不同的颜色映射,我尝试更改vmax的值。但都没有成功...

如果我将ax0放在ax1-3之后,那么ax0会获得正确的颜色,而不是ax1-3

我已经查看了其他类似问题(Two different color colormaps in the same imshow matplotlib),这些问题讨论创建掩码数组或自定义颜色映射,但由于png文件原点针对ax0,我真的不知道该如何继续。

编辑:

玩具数据:

ziAA = np.random.rand(4, 4, 4)
ziAB = np.random.rand(4, 4, 4)
ziBA = np.random.rand(4, 4, 4)

玩具png图像:

Toy image

使用此图像,统一的颜色变为白色。 我实际的图像是统一的红色。 这表明通过适当调整vmin,vmax和可能的其他控制参数,可以使png图像正确显示。 但是,我对任何png图像都有效的解决方案感兴趣...


2
你能否在你的示例中包含(玩具)数据以重现问题? - thomas
1
你能否编辑你的代码,包括tick_locator? 一个完整运行的例子更有可能鼓励别人尝试解决你的问题... - urschrei
使用im0 = ax0.imshow(im2, aspect='auto',extent=[-0.15,0.15,0,4])看起来对我来说效果不错:这不是您要寻找的吗? - stellasia
@stellasia 是的。是的,我太傻了。我该如何给你赏金? - Nigu
@urschrei。抱歉,在精简代码时,我不小心删除了那一行。该变量已经在我的Canopy会话中加载,因此在检查它时没有出现问题。我现在会进行编辑... - Nigu
1
@Nigu,太好了!我已经将我的评论转化为答案,如果您对此解决方案感到满意,请随意接受它。谢谢! - stellasia
1个回答

1

With:

im0 = ax0.imshow(im2, aspect='auto',extent=[-0.15,0.15,0,4])

它产生以下结果:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接