Home > Software engineering >  How to refresh plot in Python
How to refresh plot in Python

Time:02-16

I have some issue to do a graph and I was wondering if someone could help me please. Here is my situation :

I've got two arrays : one for temperature values and another for the time.

My goal is to do a graph representing the temperature in function of time that refresh automatically each time a value is appended in my arrays (every 0.2 seconds).

Here is a code that I tried but it didn't work at all. I'm not at my ease at all with Python and plot so sorry for all these mistakes

import matplotlib.pyplot as plt
import random
import time

# My arrays are empty at the beginning
raw_temp_bme = []
temps = []

plt.ion()

fig, ax = plt.subplots(figsize=(8, 6))
line1, = ax.plot(temps, raw_temp_bme, "r") 

plt.title("Température du BME680 en fonction du temps")
plt.xlabel("Temps en ms")
plt.ylabel("Température en °C")

start_time = time.time()

while True:
    # I append my two arrays
    raw_temp.append(round(random.uniform(15.0, 30.0), 2))
    temps.append(round(time.time() - start_time, 2))

    line1.set_xdata(temps)
    line1.set_ydata(raw_temp_bme)
    fig.canvas.draw()
    fig.canvas.flush_events()
    time.sleep(0.2)

Here is a screenshot of what I've got screenshot of my graph

Nothing appears in my graph.

Thank you so much in advance

CodePudding user response:

Probably your data are just plotted outside the view that is not autoscaled. Minimal example:

import matplotlib.pyplot as plt
import random
import time

# My arrays are empty at the beginning
raw_temp_bme = [30]
temps = [0]

plt.ion()
fig, ax = plt.subplots(figsize=(8, 6))
line1, = ax.plot(temps, raw_temp_bme, "r") 

#simulating your sensor data
def get_temperature_bme680():
    x =  random.random()
    temps.append(temps[-1]   x)  
    raw_temp_bme.append(raw_temp_bme[-1]   2 * random.random() - 1)
    if len(temps) > 50:
        temps[:] = temps[1:]
        raw_temp_bme[:] = raw_temp_bme[1:] 
    time.sleep(x)
     

while True:
    get_temperature_bme680() # my fonction to append my arrays
    line1.set_xdata(temps)
    line1.set_ydata(raw_temp_bme)
    ax.set_xlim(min(temps), max(temps))
    ax.set_ylim(min(raw_temp_bme), max(raw_temp_bme))
    fig.canvas.draw()
    fig.canvas.flush_events()
    time.sleep(0.0002)

plt.show()

CodePudding user response:

enter image description here raw_temp_bme and get_temperature_bme680 is the main error you have to rewrite the program correctly errors are shown in Jupyter Notebook in detail you HVE TO LOOK at the error given in

CodePudding user response:

It seems to me that the main problem is not the plotting but rather the way how you append to your lists. Try replacing get_temperature_bme680 with the code of that function (or post the code of that function so that we don't have to guess). Also, the line line1, = ax.plot(temps, raw_temp_bme, "r") probably doens't work as raw_temp_bme doesn't exist already.

Here is a minimal example for how to do the animation: https://stackoverflow.com/a/70439692/12343828

With the updated code and printing the content of the two lists, it is clear what goes wrong: the xlim/ylim needs to be set such that the data is within the plot range. If you insert

    ax.set_xlim(min(temps), max(temps))
    ax.set_ylim(min(raw_temp_bme), max(raw_temp_bme))

just before fig.canvas.draw() that should do the trick.

PS.: you also have to correct the variable name in raw_temp.append(...).

  • Related