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 detener a matplotlib de usar factores de escala impares.

Estoy usando matplotlib para representar gráficamente algunos datos de un sensor de corriente y a veces selecciona factores de escala extraños que dificultan mucho su interpretación, por ejemplo:

Odd matplotlib scaling

A menudo lo representa sin el factor de escala, por ejemplo:

No scaling factor

lo cual es preferible ya que es mucho más fácil de leer sin un factor de escala.

Estoy utilizando lo siguiente para escalar los ejes en cada iteración del bucle:

ax.set_xlim(min(x),max(x))
ax.set_ylim(min(y),max(y)) 

¿Hay alguna forma de evitar que matplotlib represente el eje y como lo está haciendo en la primera imagen?

No sé de antemano cuáles serán los límites de y y podrían abarcar un rango grande, por lo que no puedo fijarlos a un valor constante. Además, como estoy representando una gráfica actualizada dentro de una interfaz gráfica de usuario tkinter, la figura solo se ajusta automáticamente en la inicialización de la gráfica.

Aquí hay un código mínimo para mostrar cómo estoy representando gráficamente dentro de tkinter:

### inicializar gráfica ###
self.fig, self.ax = plt.subplots(
    1,1, 
    figsize=(6.5,4), 
    dpi=150,
    tight_layout = True
)
self.line, = self.ax.plot([],[]) #gráfica vacía

self.GUIFig = FigureCanvasTkAgg(self.fig, root)

x = []
y = []

while True:

    x.append(time_delta)
    y.append(lectura_sensor_corriente)

    self.line.set_xdata(x)
    self.line.set_ydata(y)

    self.ax.set_xlim(min(x),max(x))
    self.ax.set_ylim(min(y),max(y))

    self.GUIFig.draw()
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de obligar a matplotlib a evitar trazar el eje y como lo está haciendo en la primera imagen. Puede usar el método autoscale del objeto del eje (ax) después de actualizar los datos y antes de dibujar el gráfico. Aquí está el código actualizado:

    while True:
        x.append(time_delta)
        y.append(current_sensor_reading)
    
        self.line.set_xdata(x)
        self.line.set_ydata(y)
    
        self.ax.autoscale(enable=True, axis='x', tight=True) # ajustar automáticamente el eje x
        self.ax.autoscale(enable=True, axis='y', tight=False) # ajustar automáticamente el eje y con límites flexibles
    
        self.GUIFig.draw()
    

    Al establecer tight=False para el eje y, matplotlib solo ajustará los límites si los datos están fuera de los límites actuales y dejará algo de margen alrededor de los datos. Esto evitará los factores de escala extraños que dificultan la interpretación del gráfico, al tiempo que permitirá que el eje y se ajuste al cambio del rango de datos.

Comments are closed.