Reputation: 41
I am currently working on a project that involves taking analog readings, and mapping them real time on a graph. So to complete this I am running a photo resister through an Arduino Analog port and am reading that data via python 3.4.3. On the python side I have maplotlib, and drawnow installed. The code as it is shown below will plot the first data marker that the resistor will read, but will not update it real time. However if I change the resistance and then restart the program it will then plot the new value continually. What I want it to do is change the value on the graph as I change the value of the photo resistor.
import serial # import from pySerial
import numpy # import library from Numerical python
import matplotlib.pyplot as plt # import Library from matplotlib
from drawnow import drawnow # import lib from drawnow
ConF = [] # create an empty array for graphing
ArduinoData = serial.Serial('com3',9600) # set up serial connection with arduino
plt.ion() # tell matplotlib you want interactive mode to plot data
cnt = 0
def makeFig(): # creat a function to make plot
plt.plot(ConF, 'go-')
while True: # loop that lasts forever
while (ArduinoData.inWaiting()==0): # wait till there is data to plot
pass # do nothing
arduinoString = ArduinoData.readline()
dataArray = arduinoString
Con = float(arduinoString) # turn string into numbers
ConF.append(Con) # addinf to the array.
drawnow(makeFig) # call draw now to update
plt.pause(.000001)
cnt=cnt+1
if(cnt>50):
ConF.pop(0)
I am not sure where my mistake is, there is no error message... it just plots the same data point over and over. Any help would be most welcome.
Upvotes: 3
Views: 18895
Reputation: 87526
Something like:
fig, ax = plt.subplots()
ln, = ax.plot([], [], 'go-')
while True:
x, y = get_new_data()
X, Y = ln.get_xdata(), ln.get_ydata()
ln.set_data(np.r_[X, x], np.r_[Y, y])
fig.canvas.draw()
fig.canvas.flush_events()
should do the trick.
Upvotes: 4