用于多个子图的Python颜色栏

时间:2017-02-02 08:38:10

标签: python plot subplot colorbar

假设我们想要用plt.imshow()绘制3 x 5色图图像的多个图。第一行包含某种数据,第二行包含其他类型的数据。问题是:有没有办法在公共颜色条上绘制第一个,在另一个颜色条上绘制第二个+第三行,两个组的色阶相同。

到目前为止,我处理此类问题的方式是"附加"第一个颜色条到第一行的单个(例如最后一个)图,第二个颜色条到第二和第三行的单个(最后一个图)。然后,我会设置一个合理显示数据的色阶,然后再次运行代码,通过plt.imshow()vminvmax来电中给出两组中的色彩限制。

然而,这种方式的可互动性会丢失。因此,我想知道是否有一种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()属性,以便更新所有图像的色阶以及色条到新色彩限制的比例?

0 个答案:

没有答案