Dos barras de colores en la cuadrícula de imagen en matplotlib

Me gustaría tener el siguiente diseño en matplotlib:

Imagen 1a Imagen 1b Imagen 2a Imagen 2b Imagen 2b Barra de color a Barra de color b

La Barra de colores a es para el Conjunto de imágenes a, y la Colobar b es para el Conjunto de imágenes b.

He intentado usar ImageGrid para crear los ejes para las imágenes, pero no tuve suerte en hacer las barras de colores correctas. Por ejemplo:

fig = plt.figure() grid = ImageGrid(fig, 111, (1,6), aspect=False, share_all=False) # Get data1a, data1b, ... im1a = grid[0].pcolormesh(data1a) im1b = grid[1].pcolormesh(data1b) im2a = grid[2].pcolormesh(data2a) im2b = grid[3].pcolormesh(data2b) plt.colorbar(im1a, cax=grid[4]) plt.colorbar(im1b, cax=grid[5]) 

El problema con esto es que las llamadas a la barra de colores () se confundieron con los límites del eje de las imágenes, aunque especifiqué share_all = False en ImageGrid ().

¿Hay algún consejo sobre esto? Muy apreciado.

Para futuras referencias, es útil tener un ejemplo completo de trabajo, para que alguien pueda copiar y pegar su código y reproducir su problema directamente. Por ejemplo, puedo ver que has importado ImageGrid , pero una statement de importación completa ayudaría con esto, al igual que crear conjuntos de datos falsos para data1a , data1b , etc.

Además, parece que tiene un (1,6) donde debería tener (1,4) en su statement anterior: grid = ImageGrid(fig, 111, (1,4), aspect=False, share_all=False) , aunque esta no es la solución a su problema.

Cuando quiero dos o más barras de color, mi enfoque es usar get_position() en un eje, que devuelve las coordenadas de las esquinas del eje como atributos x0,y0,x1,y1 . Desde aquí, defino cada eje de la barra de color por separado y coloco cada uno exactamente donde quiero que vaya. Para que esto se ajuste a sus necesidades, tendrá que juguetear con los detalles de fig.add_axes([1.01, bbox_ax.y0, 0.02, bbox_ax.y1-bbox_ax.y0]) en el siguiente código. Por ejemplo, las dos primeras entradas 1.01, bbox_ax.y0 significan “coloque la esquina inferior en x=1.01 y y=bbox_ax.y0 “. Las segundas dos entradas, 0.02, bbox_ax.y1-bbox_ax.y0 definen el ancho horizontal y vertical del eje de la barra de colores, respectivamente. Me gusta que los ejes de la barra de color estén alineados con los ejes de la gráfica, por lo que uso bbox_ax.y1-bbox_ax.y0 para el ancho vertical.

Tenga en cuenta que estoy usando mp.subplots() lugar de ImageGrid() , ya que no estoy tan familiarizado con este último, y no creo que sea necesario.

 import matplotlib.pyplot as mp import numpy import mpl_toolkits.axes_grid1 data1a = numpy.random.rand(100,100) data1b = numpy.random.rand(100,100) data2a = numpy.random.rand(100,100) data2b = numpy.random.rand(100,100) fig, axes = mp.subplots(1, 4, figsize=(8,2)) im1a = axes[0].pcolormesh(data1a, cmap='magma') im1b = axes[1].pcolormesh(data1b, cmap='magma') im2a = axes[2].pcolormesh(data2a, cmap='viridis') im2b = axes[3].pcolormesh(data2b, cmap='viridis') fig.tight_layout() # get bounding box information for the axes (since they're in a line, you only care about the top and bottom) bbox_ax = axes[0].get_position() # fig.add_axes() adds the colorbar axes # they're bounded by [x0, y0, x_width, y_width] cbar_im1a_ax = fig.add_axes([1.01, bbox_ax.y0, 0.02, bbox_ax.y1-bbox_ax.y0]) cbar_im1a = mp.colorbar(im1a, cax=cbar_im1a_ax) cbar_im2a_ax = fig.add_axes([1.09, bbox_ax.y0, 0.02, bbox_ax.y1-bbox_ax.y0]) cbar_im1a = mp.colorbar(im2a, cax=cbar_im2a_ax) 

Esto produce la siguiente figura:

introduzca la descripción de la imagen aquí

También puede hacer esto como una cuadrícula de 2×2 con una syntax ligeramente diferente:

 fig, axes = mp.subplots(2, 2, figsize=(4,4)) im1a = axes[0,0].pcolormesh(data1a, cmap='magma') im1b = axes[0,1].pcolormesh(data1b, cmap='magma') im2a = axes[1,0].pcolormesh(data2a, cmap='viridis') im2b = axes[1,1].pcolormesh(data2b, cmap='viridis') fig.tight_layout() bbox_ax_top = axes[0,1].get_position() bbox_ax_bottom = axes[1,1].get_position() cbar_im1a_ax = fig.add_axes([1.01, bbox_ax_top.y0, 0.02, bbox_ax_top.y1-bbox_ax_top.y0]) cbar_im1a = mp.colorbar(im1a, cax=cbar_im1a_ax) cbar_im2a_ax = fig.add_axes([1.01, bbox_ax_bottom.y0, 0.02, bbox_ax_bottom.y1-bbox_ax_bottom.y0]) cbar_im1a = mp.colorbar(im2a, cax=cbar_im2a_ax) 

Lo que produce esta figura:

introduzca la descripción de la imagen aquí

El uso de pcolormesh , que por defecto se traza en ejes con aspecto automático, no requiere ningún tratamiento especial para crear barras de colores.

La forma más fácil de hacerlo es usar una cuadrícula con un ancho de columna desigual. El rest viene automáticamente.

 import matplotlib.pyplot as plt import numpy as np fig, axes = plt.subplots(ncols=6,figsize=(7,2.2), gridspec_kw={"width_ratios":[1,1,1,1, 0.08,0.08]}) fig.subplots_adjust(wspace=0.6) im0 = axes[0].pcolormesh(np.random.rand(11,11), vmin=0, vmax=1, cmap="RdBu") im1 = axes[1].pcolormesh(np.random.rand(11,11), vmin=0, vmax=1, cmap="RdBu") im2 = axes[2].pcolormesh(np.random.rand(11,11), vmin=0, vmax=1) im3 = axes[3].pcolormesh(np.random.rand(11,11), vmin=0, vmax=1) axes[0].set_ylabel("y label") fig.colorbar(im0, cax=axes[4]) fig.colorbar(im2, cax=axes[5]) plt.show() 

introduzca la descripción de la imagen aquí