punto graficos graficas graficar dispersion dibujar diagrama coordenadas python keyboard matplotlib interactive

python - graficos - Gráfico de matplotlib interactivo con dos controles deslizantes



matplotlib title position (4)

Usé matplotlib para crear una gráfica, que depende de 8 variables. Me gustaría estudiar cómo cambia la trama cuando cambio algunos de ellos. Creé un script que llama a matplotlib y genera diferentes instantáneas que luego convertí en una película, no está mal, pero es un poco torpe.

  1. Me pregunto si de alguna manera podría interactuar con la regeneración de la trama usando las teclas del teclado para aumentar / disminuir los valores de algunas de las variables y ver al instante cómo cambia la trama.

  2. ¿Cuál es el mejor enfoque para esto?

  3. Además, si me puede indicar enlaces interesantes o un enlace con un ejemplo de trama con solo dos controles deslizantes.


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

Hay un ejemplo en la página de ejemplos 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 siendo receptivos y no recolectados como basura, las referencias a los objetos ( amp_slider , freq_slider , etc.) deben mantenerse por usted mismo.

(Estoy haciendo esta 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 aclara el problema. 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], axisbg=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], axisbg=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], axisbg=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 bastante buena funcionalidad de interfaz gráfica de usuario. Hay algunos ejemplos de documentación en el tarball fuente de matplotlib, en / examples / user_interfaces y matplotlib> / examples / event_handling. Específicamente en el manejo de teclas es: http://matplotlib.sourceforge.net/examples/event_handling/keypress_demo.html

He hecho algo similar a lo que pretendes:

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 desplazarme a través de la visualización de diferentes imágenes en una pila en las pulsaciones de teclas, pero debería poder poner la lógica para modificar sus valores dada la entrada del teclado.

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


No creo que simplemente trazar gráficos usando plt.plot te permita hacer esto. Tendrá que hacer una secuencia de comandos / aplicación GUI personalizada integrando Matplotlib en ella. Actualmente, Matplotlib admite todos los kits de herramientas GUI principales: PyGTK +, PyQt4 y wxPython.
Uso wxPython e incrustando matplotlib en él es bastante fácil. Similar debería ser el caso con los otros toolkits GUI. Puede obtener toda la información que necesita para esto en el libro:

Está disponible en Amazon here .


Use waitforbuttonpress(timeout=0.001) luego trazar verá las waitforbuttonpress(timeout=0.001) su mouse.