Interfaz de desplazamiento de tiempo en matplotlib -- python campo con matplotlib camp codereview Relacionados El problema

Time-scrolling interface in matplotlib


15
vote

problema

Español

He creado una interfaz simple para ver una serie de tiempo a medida que cambia con el tiempo en Matplotlib. Puede pausar, restablecer o hacer clic / arrastrar en la línea de tiempo para cambiar la vista. ¿He usado la API de MATPLOTLIB de la manera más efectiva posible?

  import numpy as np from collections import deque  import matplotlib.pyplot as plt import matplotlib.animation as animation from matplotlib.widgets import Button, Slider   class AnalogPlot:      def __init__(self, data, display_len):         self.buff = deque(np.zeros(display_len))         self.display_len = display_len         self.data = data          # set up the plot         self.fig = plt.figure()         self.ax = self.fig.add_subplot(111, xlim=(0, t_max), ylim=(-1, 1))         self.ax.set_xticks((0, t_max))         self.lines = self.ax.plot([], [])          # setup the animation         self.cur_frame = 0         self.anim = animation.FuncAnimation(self.fig, self._update,                                             interval=1.0)          # setup the animation control         self.anim_running = True      def _add_to_buff(self, buf, val):         if len(buf) < self.display_len:             buf.appendLeft(val)         else:             buf.popleft()             buf.append(val)      def _update(self, frame):         frame = self.cur_frame         self._add_to_buff(self.buff, self.data[frame:frame+1])         self.lines[0].set_data(range(self.display_len), self.buff)          self.ax.set_xticklabels((str(frame), str(frame+self.display_len)))          self.time_slider.eventson = False         self.time_slider.set_val(frame)         self.time_slider.eventson = True          self.cur_frame += 1          return self.lines      def _pause(self, event):         if self.anim_running:             self.anim.event_source.stop()             self.anim_running = False         else:             self.anim.event_source.start()             self.anim_running = True      def _reset(self, event):         self._set_val(0)      def _set_val(self, frame=0):         frame = int(frame)         self.cur_frame = frame         new_start = frame - self.display_len         if new_start >= 0:             self.buff = deque(self.data[new_start:frame])         else:             self.buff = deque(np.concatenate((np.zeros(np.abs(new_start)),                                               self.data[:frame])))          self.anim.event_source.stop()         self.anim = animation.FuncAnimation(self.fig, self._update,                                             interval=1.0)         self.anim_running = True      def animate(self):         pause_ax = self.fig.add_axes((0.7, 0.025, 0.1, 0.04))         pause_button = Button(pause_ax, 'pause', hovercolor='0.975')         pause_button.on_clicked(self._pause)          reset_ax = self.fig.add_axes((0.8, 0.025, 0.1, 0.04))         reset_button = Button(reset_ax, 'reset', hovercolor='0.975')         reset_button.on_clicked(self._reset)          slider_ax = self.fig.add_axes((0.1, 0.025, 0.5, 0.04))         self.time_slider = Slider(slider_ax, label='Time',                                   valmin=0, valmax=self.data.shape[0],                                   valinit=0.0)          self.time_slider.on_changed(self._set_val)          plt.show()   t_max = 100 lin_sig = np.linspace(0, 1, 1000) analog_plot = AnalogPlot(lin_sig, t_max) analog_plot.animate()   
Original en ingles

I've create a simple interface for viewing a time-series as it changes over time in matplotlib. You can pause, reset or click/drag on the time-line to change the view. Have I used the matplotlib API as effectively as possible?

import numpy as np from collections import deque  import matplotlib.pyplot as plt import matplotlib.animation as animation from matplotlib.widgets import Button, Slider   class AnalogPlot:      def __init__(self, data, display_len):         self.buff = deque(np.zeros(display_len))         self.display_len = display_len         self.data = data          # set up the plot         self.fig = plt.figure()         self.ax = self.fig.add_subplot(111, xlim=(0, t_max), ylim=(-1, 1))         self.ax.set_xticks((0, t_max))         self.lines = self.ax.plot([], [])          # setup the animation         self.cur_frame = 0         self.anim = animation.FuncAnimation(self.fig, self._update,                                             interval=1.0)          # setup the animation control         self.anim_running = True      def _add_to_buff(self, buf, val):         if len(buf) < self.display_len:             buf.appendLeft(val)         else:             buf.popleft()             buf.append(val)      def _update(self, frame):         frame = self.cur_frame         self._add_to_buff(self.buff, self.data[frame:frame+1])         self.lines[0].set_data(range(self.display_len), self.buff)          self.ax.set_xticklabels((str(frame), str(frame+self.display_len)))          self.time_slider.eventson = False         self.time_slider.set_val(frame)         self.time_slider.eventson = True          self.cur_frame += 1          return self.lines      def _pause(self, event):         if self.anim_running:             self.anim.event_source.stop()             self.anim_running = False         else:             self.anim.event_source.start()             self.anim_running = True      def _reset(self, event):         self._set_val(0)      def _set_val(self, frame=0):         frame = int(frame)         self.cur_frame = frame         new_start = frame - self.display_len         if new_start >= 0:             self.buff = deque(self.data[new_start:frame])         else:             self.buff = deque(np.concatenate((np.zeros(np.abs(new_start)),                                               self.data[:frame])))          self.anim.event_source.stop()         self.anim = animation.FuncAnimation(self.fig, self._update,                                             interval=1.0)         self.anim_running = True      def animate(self):         pause_ax = self.fig.add_axes((0.7, 0.025, 0.1, 0.04))         pause_button = Button(pause_ax, 'pause', hovercolor='0.975')         pause_button.on_clicked(self._pause)          reset_ax = self.fig.add_axes((0.8, 0.025, 0.1, 0.04))         reset_button = Button(reset_ax, 'reset', hovercolor='0.975')         reset_button.on_clicked(self._reset)          slider_ax = self.fig.add_axes((0.1, 0.025, 0.5, 0.04))         self.time_slider = Slider(slider_ax, label='Time',                                   valmin=0, valmax=self.data.shape[0],                                   valinit=0.0)          self.time_slider.on_changed(self._set_val)          plt.show()   t_max = 100 lin_sig = np.linspace(0, 1, 1000) analog_plot = AnalogPlot(lin_sig, t_max) analog_plot.animate() 
     

Lista de respuestas

1
 
vote

me parece bien.

envíelo.

(Considere usar Flake8, e enterrar las últimas cuatro líneas dentro de rm.c4 ).

 

Looks good to me.

Ship it.

(Consider using flake8, and burying the last four lines within if __name__ == '__main__':.)

 
 

Relacionados problema

12  Tweets de transmisión en vivo y trazando su valor sentimental en colores en un mapa del mundo  ( Live streaming tweets and plot its sentimental value in colors on a world map ) 
Quiero tener a alguien revisar y ayudarme a obtener buenas ideas sobre cómo mejorar mi proyecto actual. Toda la información sobre el proyecto está en el sig...

7  Salida de parcelas de dispersión [cerrada]  ( Outputting scatter plots ) 
cerrado. Esta pregunta es off-topic . Actualmente no está aceptando respuestas. ¿Quieres ...

5  Probabilidad de evento usando el límite central del teorema + resultados de trazado  ( Probability of event using central limit theorem plotting results ) 
He estado haciendo un curso de udemy llamado: "Estadísticas para la ciencia de los datos" y decidí resolver una de las tareas con Python para matar a dos pája...

5  Evaluando una serie de polinomios legendra  ( Evaluating a series of legendre polynomials ) 
La siguiente función representa el potencial electrostático, en coordenadas esféricas, debido a un anillo de carga $ Q = 1 $ y RADIUS $ R = 1 $, colocado ...

5  Evolución de la red social  ( Social network evolution ) 
Estoy escribiendo un pedazo de código que modela la evolución de una red social. La idea es que cada persona está asignada a un nodo y relaciones entre las pe...

3  Trazando muchas imágenes a la vez en matplotlib  ( Plotting many images at once in matplotlib ) 
Estoy usando numpy y matplotlib para hacer una simulación estadística. La simulación en sí misma es bastante rápida gracias a la vectorización nompy, sin ...

8  Programa Python para verificar si un conjunto de puntos está en tierra o en el mar  ( Python program to check if a set of points is at land or at sea ) 
He escrito un programa que divide un área geográfica en células con tamaño 0.002 grados longitud por 0.001 grados latitud, y verifique cada celda ya sea q...

5  Automatizar un conjunto A de informes semanales, incluidos los gráficos y la entrega de informes  ( Automating a set a of weekly reports including graphs and delivery of reports ) 
He estado escribiendo código para automatizar algunos informes semanales. Tuve Ayuda sobre el desbordamiento de la pila . Tengo código que funciona en su may...

2  Datos de lectura y lectura de archivos binarios  ( Binary file reading and plotting data ) 
Este código lee el archivo binario. Los datos de lectura se convierten en valores firmados y se trazan si el usuario lo quiere. los datos se ven a continua...

13  Numérica para un cálculo de teoría de juegos usando la utilidad esperada  ( Numerics for a game theory calculation using expected utility ) 
Estoy tratando de replicar los resultados de Bruce B. de Mesquita (BDM) en la teoría del juego político para la predicción. Sobre la base de dónde se encuentr...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos