用于多个子图的Python颜色条

2024-09-30 16:27:19 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我们要用plt.imshow()绘制一个3x5彩色绘图图像的倍数。第一行包含某种数据,第二行和第三行包含其他类型的数据。问题是:有没有一种方法可以将第一行绘制在公共色条上,第二行和第三行绘制在不同的色阶上,两组的色阶是相同的吗。在

到目前为止,我处理这些问题的方法是将第一个颜色条“附加”到第一行的单个(例如最后一个)绘图,将第二个颜色条“附加”到第二行和第三行的单个(最后一个绘图)绘图上。然后我将设置一个合理显示数据的colorscale并再次运行代码,通过vminvmax调用plt.imshow()中的两个组中的颜色限制。在

然而,这样交互作用就失去了。所以我想知道是否有一种Python式的方式将两个色条附加到整个第一行和第二行+第三行,这样就有一种句柄可以编辑颜色限制(例如,通过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]')

不过,我有兴趣知道是否有某种指定类型的图像句柄组/容器已经具有相关的attributes方法(不需要循环),或者是否有更聪明的方法。在

在上面的示例代码中,colorbar还没有被绘制出来,但是在循环之后的plt.colorbar()应该仍然是可能的,因为这样我们就有了它应该放置的轴,并且(假设它存在)提到的图像“container”。在

出于演示的目的,您还可以使用3x3子批次和随机矩阵。在

谢谢你的帮助!在

注:如何增加colorbar的垂直大小以适合整个第二行和第三行,而不是只适合第三行?有没有可能使用make_axes_locatable?在


PUSH:这个问题也可以这样表述:是否有一个matplotlib mappable(类似于im,但包含多个)可以传递给plt.colorbar(),并且有一个set_clim()属性,这样所有图像的颜色比例以及颜色条的比例都会更新到新的颜色限制?在


Tags: 方法pos图像绘图data颜色绘制plt