Establezca el tamaño de la barra de colores de Matplotlib para que coincida con el gráfico
No puedo lograr que colorbar
gráficos imshow
como este tengan la misma altura que el gráfico, salvo que use Photoshop después del hecho. ¿Cómo consigo que las alturas coincidan?
Esta combinación (y valores cercanos a estos) parece funcionar "mágicamente" para mí para mantener la barra de colores escalada en la trama, sin importar el tamaño de la pantalla.
plt.colorbar(im,fraction=0.046, pad=0.04)
Tampoco requiere compartir el eje, lo que puede descuadrar la trama.
Puede hacer esto fácilmente con matplotlib AxisDivider .
El ejemplo de la página vinculada también funciona sin utilizar subtramas:
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
import numpy as np
plt.figure()
ax = plt.gca()
im = ax.imshow(np.arange(100).reshape((10,10)))
# create an axes on the right side of ax. The width of cax will be 5%
# of ax and the padding between cax and ax will be fixed at 0.05 inch.
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%", pad=0.05)
plt.colorbar(im, cax=cax)
Agradezco todas las respuestas anteriores. Sin embargo, como señalaron algunas respuestas y comentarios, el axes_grid1
módulo no puede abordar GeoAxes, mientras que ajustar fraction
, pad
, shrink
y otros parámetros similares no necesariamente pueden dar un orden muy preciso, lo que realmente me molesta. Creo que dar lo colorbar
suyo axes
podría ser una mejor solución para abordar todas las cuestiones que se han mencionado.
Código
import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure()
ax = plt.axes()
im = ax.imshow(np.arange(100).reshape((10,10)))
# Create an axes for colorbar. The position of the axes is calculated based on the position of ax.
# You can change 0.01 to adjust the distance between the main image and the colorbar.
# You can change 0.02 to adjust the width of the colorbar.
# This practice is universal for both subplots and GeoAxes.
cax = fig.add_axes([ax.get_position().x1+0.01,ax.get_position().y0,0.02,ax.get_position().height])
plt.colorbar(im, cax=cax) # Similar to fig.colorbar(im, cax = cax)
Resultado
Más adelante, encuentro que matplotlib.pyplot.colorbar
la documentación oficial también ofrece ax
opciones, cuáles son los ejes existentes que brindarán espacio para la barra de colores. Por lo tanto, es útil para múltiples subtramas, consulte a continuación.
Código
fig, ax = plt.subplots(2,1,figsize=(12,8)) # Caution, figsize will also influence positions.
im1 = ax[0].imshow(np.arange(100).reshape((10,10)), vmin = -100, vmax =100)
im2 = ax[1].imshow(np.arange(-100,0).reshape((10,10)), vmin = -100, vmax =100)
fig.colorbar(im1, ax=ax)
Resultado
Nuevamente, también puedes lograr efectos similares especificando cax, una forma más precisa desde mi perspectiva.
Código
fig, ax = plt.subplots(2,1,figsize=(12,8))
im1 = ax[0].imshow(np.arange(100).reshape((10,10)), vmin = -100, vmax =100)
im2 = ax[1].imshow(np.arange(-100,0).reshape((10,10)), vmin = -100, vmax =100)
cax = fig.add_axes([ax[1].get_position().x1-0.25,ax[1].get_position().y0,0.02,ax[0].get_position().y1-ax[1].get_position().y0])
fig.colorbar(im1, cax=cax)