Real-time plots in 20 lines

The Plot Twists

© Lead Image © Volodymyr Horbovyy, 123rf.com

© Lead Image © Volodymyr Horbovyy, 123rf.com

Article from Issue 244/2021
Author(s):

Use Gnuplot with command-line utilities.

Some excellent charting and plotting packages can be found, but if you're like me, you sometimes just want to do a quick dynamic test plot without a lot of custom setup. Gnuplot is a command-line charting utility that has been around for a while, and I was amazed how easy it was to get up and running. In only 20 lines of scripting code, I was able to create real-time line and bar charts.

In this article, I introduce Gnuplot with two dynamic examples: The first shows the status of Raspberry Pi I/O pins, and the second is a line chart of CPU diagnostics.

Getting Started

Gnuplot [1] can be installed on Linux, Windows, and macOS. To install Gnuplot on Ubuntu, enter:

sudo apt-get install gnuplot

Gnuplot is typically run as a command-line utility, but it can also be run manually, with the charting instructions and data values inserted inline. To plot four sets of data points in a line chart, you could enter:

$ gnuplot
gnuplot> $Mydata << EOD
# Now enter some data
2 1
3 1.5
4 2.1
5 3.3
EOD
gnuplot> plot $Mydata with line

Data block names must begin with a $ character, which distinguishes them from other types of persistent variables. The end-of-data delimiter (EOD here) can be any sequence of characters. For this example, the plot command creates a line chart from the $Mydata variable (Figure 1).

Figure 1: A line chart plotted with inline data.

Static Bar Chart

For a simple Gnuplot bar chart, you could plot the real-time status of Raspberry Pi general purpose input/output (GPIO) pins. A static bar chart presentation can be created with a data file (called gpio.dat here):

# gpio.dat - data file for GPIO pin values
# column1 = chart position, column2 = heading, column3 = value
0 GPIO2 0
1 GPIO3 1
2 GPIO4 1
# ...

To plot a bar chart (Figure 2), the fill style and bar width need to be defined. The using 1:3:xtic(2) argument, shown in the next code block, configures the first column in the data file as the x position, the third column as the y value, and the second column as the x-axis labels. Use the interactive commands

$ gnuplot
gnuplot> set style fill solid
gnuplot> set boxwidth 0.5
gnuplot> plot "gpio.dat" using 1:3:xtic(2)with boxes title ""

to plot the file.

Figure 2: A simple bar chart of Raspberry Pi GPIO pins.

Real-Time Bar Chart

The previous example used a manually created gpio.dat data file. The current status of GPIO pins can be found with the gpio command-line utility [2]. For example, to get the status of GPIO pin 9, enter:

gpio read 9

By adding some Bash and an Awk script, you can create a gpio.dat file:

$ gpio read 9
1
$ gpio read 9 | awk '{ print "9 GPIO9 " $1 }'
9 GPIO9 1
$ gpio read 9 | awk '{ print "9 GPIO9 " $1 }' >gpio.dat
$ cat gpio.dat
9 GPIO9 1

To make a dynamic bar chart, create the gpio_bars.txt Gnuplot script shown in Listing 1. The Gnuplot scripting language is quite powerful and supports a wide range of functions and control statements.

Listing 1

Dynamic Bar Chart

01 # Create a dynamic bar chart that reads GPIO pins every 5 seconds
02 #
03 set title "PI GPIO Data"
04 set boxwidth 0.5
05 set style fill solid
06
07 # Create a dummy file to get started without errors
08 system "echo '0 GPIO2 1' > gpio.dat"
09
10 plot "gpio.dat" using 1:3:xtic(2) with boxes title ""
11
12 while (1) {  # make a new 'gpio.dat' every cycle with fresh data
13   system "echo '' > gpio.dat"
14   do for [i=2:29] {
15     j = i-2 # put first GPIO pin at position 0
16     system "gpio read " .i.  "  | awk '{ print  \"" . j . " GPIO" . i . " \" $1 }' >> gpio.dat
17   }
18   replot
19   pause 5
20 }

Rather than manually adding lines for each GPIO pin status, a for loop can iterate from pins 2 to 29 (lines 14-17). A system command runs the GPIO utility and Bash commands (line 16). To refresh the data, use the replot and pause commands (lines 18 and 19), and enter

gnuplot -persist gpio_bars.txt

to run the script (Figure 3).

Figure 3: Dynamic status of Rasp Pi GPIO pins.

Buy this article as PDF

Express-Checkout as PDF
Price $2.95
(incl. VAT)

Buy Linux Magazine

SINGLE ISSUES
 
SUBSCRIPTIONS
 
TABLET & SMARTPHONE APPS
Get it on Google Play

US / Canada

Get it on Google Play

UK / Australia

Related content

  • Open Data

    A lot of COVID-19 data is available through online REST APIs. With a little ingenuity and some open source tools, you can extract and analyze the data yourself.

  • Julia on the Pi

    Create GUIs and a web app that connects to sensors.

  • Tutorial – Matplotlib

    Matplotlib offers so many options that you may have trouble deciding on which ones to use for your plots.

  • Workspace: ExifTool

    Understanding the full power of ExifTool can be daunting. We show how to put it to practical use.

  • Go on the Rasp Pi

    We show you how to create a Go web app that controls Raspberry Pi I/O.

comments powered by Disqus