假设我们想要用plt.imshow()
绘制3 x 5色图图像的多个图。第一行包含某种数据,第二行包含其他类型的数据。问题是:有没有办法在公共颜色条上绘制第一个,在另一个颜色条上绘制第二个+第三行,两个组的色阶相同。
到目前为止,我处理此类问题的方式是"附加"第一个颜色条到第一行的单个(例如最后一个)图,第二个颜色条到第二和第三行的单个(最后一个图)。然后,我会设置一个合理显示数据的色阶,然后再次运行代码,通过plt.imshow()
,vmin
在vmax
来电中给出两组中的色彩限制。
然而,这种方式的可互动性会丢失。因此,我想知道是否有一种pythonic方式将两个颜色条连接到整个第一行和第二行+第三行,以便有一种允许编辑颜色的某种句柄限制(例如通过set_clim
),以便该组中的所有图像同时设置为这些限制。
考虑下面的示例代码。一种方法可能是某种图像句柄列表。在每次迭代的这样一个列表中,将附加下一个句柄,然后在创建绘图之后,可以使用im1[i].set_clim()
循环遍历该列表。
im1 = []
im2 = []
for i in range(3):
for j in range(nbins):
pos = i*nbins + j + 1
if i % 3 == 0:
data = npts_lbins_map[j,:,:]
elif i % 3 == 1:
data = sigx_lbins_med_map[j,:,:]
elif i % 3 == 2:
data = sigy_lbins_med_map[j,:,:]
plt.subplot(3,nbins,pos)
if pos <= 5:
im1.append(plt.imshow(data, interpolation='none', origin='lower', extent=[lonst_all.min(), lonst_all.max(), lathg_all.min(), lathg_all.max()]))
elif pos > 5:
im2.append(plt.imshow(data, interpolation='none', origin='lower', extent=[lonst_all.min(), lonst_all.max(), lathg_all.min(), lathg_all.max()]))
if pos == 5:
ax1 = plt.gca()
divider1 = make_axes_locatable(ax1)
cax1 = divider1.append_axes("right", size="5%", pad=0.05)
elif pos == 15:
ax2 = plt.gca()
divider2 = make_axes_locatable(ax2)
cax2 = divider2.append_axes("right", size="5%", pad=0.05)
plt.xlabel('Stonyhurst longitude [deg]')
plt.ylabel('latitude [deg]')
但是我有兴趣知道是否有一些指定类型的图像句柄组/容器已经具有相关的属性方法,不需要循环,或者是否有更聪明的方法
在上面的示例代码中,还没有绘制颜色条,但是在循环之后仍然可以使用plt.colorbar()
,因为那时我们有应该放置的轴以及(假设它存在)提到的图像&#39;容器&#39;。
出于演示目的,您还可以使用带有随机矩阵的3 x 3子图。
感谢您的帮助!
P.S。:如何增加颜色条的垂直尺寸以适应整个第二行+第三行而不仅仅是第三行? make_axes_locatable
是否存在某种可能性?
PUSH:问题也可以这样表达:是否有matplotlib mappable
(类似于im
,但包含多个),可以传递给plt.colorbar()
具有set_clim()
属性,以便更新所有图像的色阶以及色条到新色彩限制的比例?