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.

Cómo utilizar botones de opción para controlar un gráfico de sectores en matplotlib

Tengo un pequeño problema en mi código y espero que alguien tenga una idea para ayudarme. Entonces, he creado un gráfico circular y, con RadioButtons, me gustaría ‘controlar’ el parámetro ‘explode’. Resultado esperado: tenemos un gráfico circular, tenemos RadioButtons y cuando hacemos clic en un botón de radio, en el gráfico circular se extrae la ‘serie’ que coincide con el botón de radio seleccionado (gracias a ‘explode’) y podemos hacerlo tantas veces como queramos.

Mi problema: he creado los botones de radio y, cuando se hace clic en ellos, se abre una nueva ventana con el resultado esperado, pero me gustaría tener el gráfico circular y los botones de radio en la misma ventana.

Mi código justo abajo:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import RadioButtons
rax = plt.axes([0.05, 0.7, 0.15, 0.15])
radio = RadioButtons(rax, ('0-4 ans', '5-10 ans', '11-13 ans', '14-17 ans'))
def explode_function(label):
    labels = '0-4 ans', '5-10 ans', '11-13 ans', '14-17 ans'
    sizes = [17.4, 25.7, 18.6, 38.3]
    explode = (0, 0, 0, 0)  # solo "explode" el segundo segmento (es decir, 'Hogs')
    fig1, ax = plt.subplots()
    if label == '0-4 ans':
        explode = (0.15, 0, 0, 0)
    elif label == '5-10 ans':
        explode = (0, 0.15, 0, 0)
    elif label == '11-13 ans':
        explode = (0, 0, 0.15, 0)
    elif label == '14-17 ans':
        explode = (0, 0, 0, 0.15)
    ax.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
        shadow=True, colors=['lightblue', 'lightgreen', 'salmon', 'lightgray'])
    plt.show()
radio.on_clicked(explode_function)
plt.show()

Muchas gracias y buenas tardes.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para tener tanto el gráfico de sectores como los RadioButtons en la misma ventana, puedes mover el código que crea el gráfico de sectores fuera de la función explode_function.

    Aquí está el código modificado:

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.widgets import RadioButtons
    
    labels = ['0-4 años', '5-10 años', '11-13 años', '14-17 años']
    sizes = [17.4, 25.7, 18.6, 38.3]
    explode = [0, 0, 0, 0]
    
    fig1, ax = plt.subplots()
    pie = ax.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True, colors=['lightblue', 'lightgreen', 'salmon', 'lightgray'])
    
    rax = plt.axes([0.05, 0.7, 0.15, 0.15])
    radio = RadioButtons(rax, labels)
    
    def explode_function(label):
        explode = [0, 0, 0, 0]
        index = labels.index(label)
        explode[index] = 0.15
        pie[0].set_explode(explode)
        plt.draw()
    
    radio.on_clicked(explode_function)
    plt.show()
    

    En esta versión, primero creamos el gráfico de sectores con valores predeterminados para el parámetro explode, y almacenamos los objetos devueltos como pie. Luego, dentro de la función explode_function, modificamos el parámetro explode del objeto pie dependiendo de qué radio button se hace clic y volvemos a dibujar el gráfico con plt.draw(). De esta manera, se utiliza la ventana original para mostrar el gráfico de sectores actualizado en lugar de crear uno nuevo cada vez.

Comments are closed.