Gnuplot is a great package that allows you to do charting from the command line.
Gnuplot has a wide range of plot types but unfortunately a speedometer gauge is not one of them.
This blog documents my notes in creating a dynamic gauge.
Some useful takeaways:
- A gnuplot can be created with only graphic elements (no chart)
- A named object can be re-positioned without redrawing the background
- A gnuplot script can be called like a Bash or Python script with the first line being: #!/usr/bin/gnuplot
A Dynamic Gauge
The script gnuplot.gp is an example that refreshes a gauge chart every 5 seconds with the processor’s idle time. The idle time is obtained using the Linux top command (with some awk to get the 8th line item).
#!/usr/bin/gnuplot
#
# gnuplot.gp - speedometer dial with title as the description/value
#
set xrange [-1:1]
set yrange [0:1]
set angles degrees
set size ratio -1
# r1 = annulus outer radius, r2 = annulus inner radius
r1=1.0
r2=0.5
unset border; unset tics; unset key; unset raxis
set style fill solid noborder
# define a "needle" pointer as object 1
set object 1 circle at first 0,0 front size r1 arc [181:182] fillcolor rgb 'black'
# define the gauge background
set object circle at first 0,0 size r1 arc [0:180] fillcolor rgb 'green'
set object circle at first 0,0 size r1 arc [0:10] fillcolor rgb 'red'
set object circle at first 0,0 size r1 arc [10:20] fillcolor rgb 'yellow'
set object circle at first 0,0 front size r2 arc [0:180] fillcolor rgb 'black'
# plot the static background
plot -10 notitle
# Define a partial heading
variable = "Idle Time\n"
unit = "%"
# Refresh the plot with a new dial setting
while (1) {
# Get the idle time using the top utility
idle = system("top -n 1 | grep Cpu | awk '{print $8}'")
# scale the value from 0-100 to 180-0 (Note: arc starts on the right)
value = (100 - real(idle)) * 1.8
# show the value in the title
set title sprintf('%s %s %s', variable, idle, unit) font "Ariel,28"
# reposition the value in the gauge
set object 1 circle at first 0,0 front size r1 arc [value:(value+2)] fillcolor rgb 'black'
replot
pause 5
}

The script can be run either from gnuplot or like a Bash script:
$ # run script from gnuplot
$ gnuplot -c gauge.gp
Use Control-C to exit ...
^C
$ # make script executable
$ chmod +x gauge.gp
$ # run script like a Bash script
$ ./gauge.gp
Use Control-C to exit ...
^C
Next Steps…
From here the next steps could be to add command line arguments to make the script more generic, such as:
- pass the calculation to run (eg. pass the bash top command)
- pass the scaling, title and units