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_slider
etc.) 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, El ejemplo se ha corregido para evitar el uso de from pylab import *
), pero consigue el punto a través.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()
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.
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.