Plotting Real-time Data From Arduino Using Python (matplotlib)




About: Open Source Hardware Projects - Microcontrollers, Programming, and new prototyping technologies.

Arduino is fantastic as an intermediary between your computer and a raw electronic circuit. Using the serial interface, you can retrieve information from sensors attached to your Arduino. (You can also send information via the serial interface to actuate circuits and devices (LEDs, relays, servos, etc.) connected to your Arduino.) Once you have the data in your computer, you can do all sorts of things with it – analyze it, display it, or share it on the internet, for instance.

In this instructable, I will be reading and displaying analog data from a pair of LDRs connected to an Arduino. Attached is the schematic.

The Arduino sketch is very simple – it just reads the values from analog pins A0 and A1 (in the range [0, 1023]) and prints it to the serial port.

Here is the code:

The serial port sends values in the format:

512 300
513 280
400 200

On the computer side, I need to read these values, and plot them as a function of time. I am using Python and the Matplotlib library for this. I wanted to display this as a scrolling graph that moves to the right as data keeps coming in. For that, I am using the Python deque class to keep and update a fixed number of data points for each time frame.

You can see the full implementation here:

Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

3 People Made This Project!


  • Made with Math Contest

    Made with Math Contest
  • Multi-Discipline Contest

    Multi-Discipline Contest
  • Robotics Contest

    Robotics Contest

67 Discussions


2 years ago

Dear electronut,

I tried to implement your code in my PC using Spyder editor, but unfortunately it gives me an error (see at the bottom). I also replaced

strPort = args.port


strPort = "COM10"

since COM10 is the port I am using in my PC (Windows7 64bits). Even in this case, the error is the same. How can I solve it from the editor, please? Thanks!

usage: [-h] --port PORT error: argument --port is required
An exception has occurred, use %tb to see the full traceback.
SystemExit: 2
1 reply

3 years ago

Hello Elecronut,

Thank you for the code. I am very new to this, so I have been facing quite a few issues with running the code. I keep getting errors while running the argparse command. I replaced port with COM3 like below, but keep getting errors!

def main():

# create parser

parser = argparse.ArgumentParser(description="LDR serial")

# add expected arguments

parser.add_argument('--COM3', dest='COM3', required=True)

Error in python:

usage: [-h] --COM3 COM3 error: argument --COM3 is required

My problem is I am not sure where to replace strPort or port with COM3.

Please help!



5 replies

Reply 3 years ago

Without changing the code, run it as:

>python --port COM3

What is the output?


Reply 10 months ago

Could you please elaborate how to run code
Without changing the code, run it as:
>python --port COM3
Where do i need to make the changes


Reply 3 years ago

Thanks, it works!!! I am trying now to add the data to a csv file. Thank you for all the help again!


Reply 2 years ago

Hi RitwikaM

Did you happen to execute the python script from a python editor (e.g Spyder)? If your answer is yes, could you please send me your code?
I would like to modify the code so as to plot ONE data series from port COM10. Also, I would like to save the data series on the local HDD.


2 years ago

Great! How to reverse the flow of the graph from right to left?

1 reply

Reply 1 year ago

@line 33 change it with:



Dylan TaylorA

2 years ago

Works 'out of the box' which is seriously just fantastic in the world of analog and digital communication. Serial port can be found by looking in your arduino IDE under tools-> serial port. for me it was /dev/ttyACM0

Great work!


3 years ago

good day apologize for my English, I'm from Colombia I am currently developing my thesis project and have been almost impossible to create the code acquisition 4 sensors, I wonder if I can use some of their code in my project. and I wonder if there is any way to predefine the port COM6 not run the program from the console. thank you very much for contribution.


3 years ago


I also tried your code and I also get a nice Tk Window, BUT no plot…
apparently analogPlot.update is not called or at least does not do
anything. I already tried some things to fix it, but without success.
Any hint?

Could it be the backend, that doesn’t want to show me anything?

Otherwise, a nice, easy and understandable code!!! Well done!

Thanks in advance.


1 reply

4 years ago on Introduction

Hello elecronut,

Thank you for sharing. I like your project and I will use with my robot.

I have a ultrasonic attached to a servo to mapping obstacles. I send to serial port to numbers: angle of the servo and detected distance. Now, I want to graphic the obstacles.

I try your code but I need a XY praph. I mean, use the first number (angle) for X and the second number (distance) as Y.

I tried to make some modification but without any success.

Could you give me any suggestions?

Thank you in advance!

4 replies

Reply 4 years ago on Introduction


You need to specify the axes data differently. Take a look at the matplotlib tutorial below:



Reply 3 years ago

Hello, I am currently working with the same thing but in a different project. I am just a newbie in python programming would you mind if I ask a copy of the changes you made to make the x axis have a different value instead of time or could you tell me how? I am trying to plot x-axis as velocity and y-axis as position for a phase plot in my case study. Thank You in Advance.

By the way I've already tried this line: a1,=ax.plot([0], [1]), 0-velocity and 1-position, however i didn't get anything on the plotting window.