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.

Gridspec de gráficos de contorno polar.

He utilizado las respuestas a esta pregunta (https://stackoverflow.com/questions/22416965/adding-a-colorbar-to-a-polar-contourf-multiplot) para generar los dos gráficos de contorno polar que aparecen uno al lado del otro. Puedo extender la cuadrícula a una cuadrícula de 2 por 2 de gráficos de contorno polar simplemente editando la respuesta al post anterior para que rastrees las posiciones de la cuadrícula:

fig, axs = plt.subplots(2, 2, figsize=(12,5),subplot_kw=dict(projection=’polar’))
p1 = axs[0,0].contourf(theta, r, Z1, 100)
p2 = axs[0,1].contourf(theta, r, Z2, 100)
p3 = axs[1,0].contourf(theta, r, Z2, 100)
p4 = axs[1,1].contourf(theta, r, Z2, 100)

Esto genera la siguiente imagen:

Imagen

El espaciado entre cada gráfico es claramente un problema. ¿Cómo puedo editar el espaciado tanto en la dirección horizontal como en la vertical y escalar cada gráfico polar para hacerlos ligeramente más grandes?

MWE

import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
import matplotlib.colors as colors
from matplotlib import gridspec#, ticker

X = np.arange(0, 70, 10)
Y = np.radians(np.linspace(0, 360, 20))
r, theta = np.meshgrid(X,Y)

Z1 = np.random.random((azimuths.size, zeniths.size))
Z2 = np.random.random((azimuths.size, zeniths.size))
Z3 = np.random.random((azimuths.size, zeniths.size))
Z4 = np.random.random((azimuths.size, zeniths.size))

fig, axs = plt.subplots(2, 2, figsize=(12,5),subplot_kw=dict(projection=’polar’))
p1 = axs[0,0].contourf(theta, r, Z1, 100)
p2 = axs[0,1].contourf(theta, r, Z2, 100)
p3 = axs[1,0].contourf(theta, r, Z2, 100)
p4 = axs[1,1].contourf(theta, r, Z2, 100)

#– obteniendo los límites del mapa de colores
vmin,vmax = p2.get_clim()
#– Definiendo una escala normalizada
cNorm = mpl.colors.Normalize(vmin=vmin, vmax=vmax)
#– Creando un nuevo eje en el lado derecho
ax3 = fig.add_axes([0.9, 0.1, 0.03, 0.8])
#– Graficando el mapa de colores en el eje creado
cb1 = mpl.colorbar.ColorbarBase(ax3, norm=cNorm)
fig.subplots_adjust(left=0.05,right=0.85)
plt.show()

En el MWE anterior, simplemente agregué algunos datos de ejemplo que se asemejan estrechamente a la publicación en esta pregunta (https://stackoverflow.com/questions/9071084/polar-contour-plot-in-matplotlib-best-modern-way-to-do-it).

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para ajustar el espaciado y escala de los gráficos polares, puedes utilizar el argumento gridspec_kw al crear los subgráficos. Este argumento toma un diccionario de propiedades de GridSpec que definen el diseño y espaciado de los subgráficos.

    En este caso, podemos modificar las propiedades width_ratios y height_ratios para ajustar el tamaño de los subgráficos, y las propiedades wspace y hspace para ajustar el espaciado entre ellos.

    Aquí tienes un ejemplo actualizado que agrega un argumento gridspec_kw y establece estas propiedades:

    import matplotlib.pyplot as plt
    import matplotlib as mpl
    import numpy as np
    import matplotlib.colors as colors
    from matplotlib import gridspec#, ticker
    
    
    X = np.arange(0, 70, 10)
    Y = np.radians(np.linspace(0, 360, 20))
    r, theta = np.meshgrid(X,Y)
    
    Z1 = np.random.random((r.size, theta.size))
    Z2 = np.random.random((r.size, theta.size))
    Z3 = np.random.random((r.size, theta.size))
    Z4 = np.random.random((r.size, theta.size))
    
    fig, axs = plt.subplots(2, 2, figsize=(12,5),subplot_kw=dict(projection='polar'), gridspec_kw={"width_ratios":[1, 1], "height_ratios":[1, 1], "wspace":0.3, "hspace":0.4})
    
    p1 = axs[0,0].contourf(theta, r, Z1, 100)
    p2 = axs[0,1].contourf(theta, r, Z2, 100)
    p3 = axs[1,0].contourf(theta, r, Z3, 100)
    p4 = axs[1,1].contourf(theta, r, Z4, 100)
    
    #-- obteniendo los límites de la paleta de colores
    vmin,vmax = p2.get_clim()
    #-- Definiendo una escala normalizada
    cNorm = mpl.colors.Normalize(vmin=vmin, vmax=vmax)
    #-- Creando un nuevo eje en el lado derecho
    ax3 = fig.add_axes([0.9, 0.1, 0.03, 0.8])
    #-- Graficando la paleta de colores en el eje creado
    cb1 = mpl.colorbar.ColorbarBase(ax3, norm=cNorm)
    
    fig.subplots_adjust(left=0.05,right=0.85)
    plt.show()
    

    En este caso, establecemos width_ratios y height_ratios en [1, 1] para hacer que cada subgráfico tenga el mismo tamaño, y wspace y hspace en 0.3 y 0.4 respectivamente para ajustar el espaciado entre ellos.

    Puedes ajustar estos valores para obtener el diseño y espaciado deseado para tus gráficos.

Comments are closed.