Establezca el tamaño de la barra de colores de Matplotlib para que coincida con el gráfico

Resuelto Elliot asked hace 11 años • 11 respuestas

No puedo lograr que colorbargráficos imshowcomo este tengan la misma altura que el gráfico, salvo que use Photoshop después del hecho. ¿Cómo consigo que las alturas coincidan? Ejemplo de discrepancia en el tamaño de la barra de colores

Elliot avatar Aug 13 '13 03:08 Elliot
Aceptado

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.

skytaker avatar Nov 03 '2014 18:11 skytaker

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)

ingrese la descripción de la imagen aquí

bogatron avatar Aug 12 '2013 20:08 bogatron

Agradezco todas las respuestas anteriores. Sin embargo, como señalaron algunas respuestas y comentarios, el axes_grid1módulo no puede abordar GeoAxes, mientras que ajustar fraction, pad, shrinky otros parámetros similares no necesariamente pueden dar un orden muy preciso, lo que realmente me molesta. Creo que dar lo colorbarsuyo axespodrí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

ingrese la descripción de la imagen aquí

Más adelante, encuentro que matplotlib.pyplot.colorbarla documentación oficial también ofrece axopciones, 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

ingrese la descripción de la imagen aquí

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)

Resultado

ingrese la descripción de la imagen aquí

Fei Yao avatar Jul 05 '2019 10:07 Fei Yao