Saltar al contenido

Gráfico matplotlib interactivo con dos controles deslizantes

Te damos la respuesta a esta duda, o por lo menos eso esperamos. Si sigues con alguna inquietud dínoslo, para nosotros será un gusto ayudarte

Solución:

Además de lo que mencionó @triplepoint, eche un vistazo al control deslizante.

Hay un ejemplo en la página de ejemplos de matplotlib. Es una barra deslizante gráfica en lugar de enlaces de teclado, pero funciona bastante bien para lo que quieres hacer.

También tenga en cuenta que para garantizar que los controles deslizantes y los botones sigan respondiendo y no se recolecten basura, las referencias a los objetos (amp_slider, freq_slideretc.) debe ser mantenido por usted mismo.

(Estoy haciendo este wiki de la comunidad, ya que solo estoy copiando y pegando del ejemplo. Este ejemplo particular enseña malos hábitos (por ejemplo, from pylab import *), pero consigue el punto a través. El ejemplo se ha corregido para evitar el uso de pylab.)

from numpy import pi, sin
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons

def signal(amp, freq):
    return amp * sin(2 * pi * freq * t)

axis_color = 'lightgoldenrodyellow'

fig = plt.figure()
ax = fig.add_subplot(111)

# Adjust the subplots region to leave some space for the sliders and buttons
fig.subplots_adjust(left=0.25, bottom=0.25)

t = np.arange(0.0, 1.0, 0.001)
amp_0 = 5
freq_0 = 3

# Draw the initial plot
# The 'line' variable is used for modifying the line later
[line] = ax.plot(t, signal(amp_0, freq_0), linewidth=2, color='red')
ax.set_xlim([0, 1])
ax.set_ylim([-10, 10])

# Add two sliders for tweaking the parameters

# Define an axes area and draw a slider in it
amp_slider_ax  = fig.add_axes([0.25, 0.15, 0.65, 0.03], facecolor=axis_color)
amp_slider = Slider(amp_slider_ax, 'Amp', 0.1, 10.0, valinit=amp_0)

# Draw another slider
freq_slider_ax = fig.add_axes([0.25, 0.1, 0.65, 0.03], facecolor=axis_color)
freq_slider = Slider(freq_slider_ax, 'Freq', 0.1, 30.0, valinit=freq_0)

# Define an action for modifying the line when any slider's value changes
def sliders_on_changed(val):
    line.set_ydata(signal(amp_slider.val, freq_slider.val))
    fig.canvas.draw_idle()
amp_slider.on_changed(sliders_on_changed)
freq_slider.on_changed(sliders_on_changed)

# Add a button for resetting the parameters
reset_button_ax = fig.add_axes([0.8, 0.025, 0.1, 0.04])
reset_button = Button(reset_button_ax, 'Reset', color=axis_color, hovercolor='0.975')
def reset_button_on_clicked(mouse_event):
    freq_slider.reset()
    amp_slider.reset()
reset_button.on_clicked(reset_button_on_clicked)

# Add a set of radio buttons for changing color
color_radios_ax = fig.add_axes([0.025, 0.5, 0.15, 0.15], facecolor=axis_color)
color_radios = RadioButtons(color_radios_ax, ('red', 'blue', 'green'), active=0)
def color_radios_on_clicked(label):
    line.set_color(label)
    fig.canvas.draw_idle()
color_radios.on_clicked(color_radios_on_clicked)

plt.show()

Ejemplo

Matplotlib tiene una funcionalidad de interfaz gráfica de usuario bastante agradable. Hay algunos ejemplos de documentación en el tarball fuente de matplotlib, en /examples/user_interfaces y matplotlib>/examples/event_handling. Específicamente sobre el manejo de claves es: http://matplotlib.sourceforge.net/examples/event_handling/keypress_demo.html

He hecho algo similar a lo que buscas:

import numpy as np
import pylab

class plotter:
    def __init__(self, initial_values):
        self.values
        self.fig = pylab.figure()
        pylab.gray()
        self.ax = self.fig.add_subplot(111)
        self.draw()
        self.fig.canvas.mpl_connect('key_press_event',self.key)

    def draw(self):
        im = your_function(self.values)
        pylab.show()
        self.ax.imshow(im)

    def key(self, event):
        if event.key=='right':
            self.values = modify()
        elif event.key == 'left':
            self.values = modify()

        self.draw()
        self.fig.canvas.draw()

Estaba usando esto para cambiar la visualización de diferentes imágenes en una pila al presionar teclas, pero debería poder poner lógica para modificar sus valores dada la entrada del teclado.

Si desea hacer cosas como tener los valores de entrada del usuario, creo que los ejemplos tienen opciones para los cuadros de diálogo, pero si solo desea aumentar/disminuir una cantidad de variables, simplemente definir pares de teclado para ellos de esta manera podría funcionar bien.

Seguí los consejos para verificar los widgets en jupyter y funcionan muy bien. El script de ejemplo se carga en GitHub https://github.com/LeonidBystrykh/course-python-for-beginners/blob/master/Interactive_dots.ipynb

from __future__ import print_function
from ipywidgets import interact, interactive, fixed, interact_manual
import ipywidgets as widgets
import matplotlib.pyplot as plt, random

def series(dots, colr):
    a,b=[],[]
    for i in range(dots):
        a.append(random.randint(1,100))
        b.append(random.randint(1,100))
    plt.scatter(a,b, c=colr)
    return()
interact(series, dots=(1,100,1), colr=["red","orange","brown"]);

La copia de la imagen está abajo.

Puedo cambiar la cantidad de puntos o su color de forma interactiva

Si para ti ha sido de utilidad nuestro post, sería de mucha ayuda si lo compartieras con otros entusiastas de la programación de esta forma contrubuyes a extender nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *