es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Barra de color unificada para todos los subtrazados en matplotlib.

Estoy tratando de agregar una barra de color a mi gráfico, que contiene 4 subtramas. He agregado las subtramas manualmente usando este código:

extent = [-8, 37, 28, 46]
fig = plt.figure(figsize=(5.5, 3.5), constrained_layout= False)
spec = fig.add_gridspec(ncols=2, nrows=2)
ax0 = fig.add_subplot(spec[0, 0], projection=ccrs.PlateCarree(), frameon= False)
ax0.set_extent(extent)

ax1 = fig.add_subplot(spec[0, 0], projection=ccrs.PlateCarree(), frameon= False)
ax1.set_extent(extent)

He escrito estas líneas hasta ax3.
Ahora que intento hacer una barra de color usando plt.colorbar()

Agrega una barra de color solo a la última subtrama… He probado otras soluciones en línea, pero todas usan fig, axes= plt.subplots(...) que no utilizo…

edición– esta pregunta https://stackoverflow.com/questions/13784201/how-to-have-one-colorbar-for-all-subplots no me ayuda realmente… cuando intento ejecutar este código

fig.subplots_adjust(right=0.8)

cbar_ax = fig.add_axes([0.85, 0.15, 0.05, 0.7])

fig.colorbar(ax3, cax=cbar_ax)

Recibo este error-
AttributeError: el objeto ‘GeoAxesSubplot’ no tiene el atributo ‘get_array’
Estoy usando Cartopy para hacer un hist2d de ocurrencias globales.

¿Alguien tiene alguna idea de cómo superar esto?
Gracias de antemano,
Karin.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema aquí radica en el hecho de que estás añadiendo manualmente tus subplots utilizando fig.add_subplot() en lugar de utilizar la función plt.subplots(), la cual retorna una matriz de objetos de ejes que pueden ser fácilmente utilizados para añadir una barra de color a todos los subplots.

    Para solucionar esto, puedes crear una sola figura con los cuatro subplots utilizando plt.subplots() y luego recorrer cada subplot para graficar tus datos. Aquí tienes un ejemplo de código:

    extent = [-8, 37, 28, 46]
    fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(5.5, 3.5), constrained_layout=False)
    
    for ax in axes.flat:
        ax.set_extent(extent)
        # grafica tus datos para cada subplot
    
    # añade una barra de color que abarque todos los subplots
    fig.subplots_adjust(right=0.8)
    cbar_ax = fig.add_axes([0.85, 0.15, 0.05, 0.7])
    fig.colorbar(im, cax=cbar_ax)
    

    En este ejemplo, axes.flat retorna un iterador 1D sobre los cuatro subplots, permitiéndote recorrer cada uno y graficar tus datos. Finalmente, fig.colorbar() añade una barra de color a toda la figura que abarca todos los subplots.

    En cuanto al AttributeError específico que estás viendo, parece que podría deberse al hecho de que estás utilizando cartopy para crear tus gráficos. Es posible que necesites utilizar un método ligeramente diferente para crear la barra de color al usar cartopy. Aquí tienes un ejemplo de la documentación de cartopy:

    import cartopy.crs as ccrs
    import matplotlib.pyplot as plt
    import numpy as np
    
    crs = ccrs.PlateCarree()
    
    # crea algunos datos falsos
    lons = np.linspace(-180, 180, 100)
    lats = np.linspace(-90, 90, 100)
    data = np.random.randn(100, 100)
    
    # crea una figura y subplots
    fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(5.5, 3.5), constrained_layout=False,
                             subplot_kw={'projection': crs})
    
    # grafica los datos en cada subplot
    for ax in axes.flat:
        ax.set_extent([-180, 180, -90, 90], crs=crs)
        im = ax.pcolormesh(lons, lats, data, transform=crs)
    
    # añade una barra de color
    fig.subplots_adjust(right=0.8)
    cbar_ax = fig.add_axes([0.85, 0.15, 0.05, 0.7], projection=crs)
    fig.colorbar(im, cax=cbar_ax)
    cbar_ax.coastlines()  # añade costas en la misma posición que los subplots
    

    Aquí, se utiliza cbar_ax.coastlines() para añadir costas a la barra de color en la misma posición que los subplots, pero puedes ajustarlo según sea necesario.

Comments are closed.