Have you ever been frustrated in math classes due to lack of visual examples of abstract topics? Have you ever wanted to quickly visualize a dataset without going through cumbersome software like Excel?

If so, you should know about gnuplot.

Gnuplot is a command line based graphing and plotting utility. In this post, I’ll outline some practical applications of gnuplot as well as some tips.

Install gnuplot

Most distos should have gnuplot in their repositories. I installed gnuplot on Arch linux by running sudo pacman -Syu gnuplot

To start using gnuplot, fire up your favorite terminal and run gnuplot. You should be faced with a prompt like so:

	G N U P L O T
	Version 5.2 patchlevel 7    last modified 2019-05-29 

	Copyright (C) 1986-1993, 1998, 2004, 2007-2018
	Thomas Williams, Colin Kelley and many others

	gnuplot home:     http://www.gnuplot.info
	faq, bugs, etc:   type "help FAQ"
	immediate help:   type "help"  (plot window: hit 'h')

Terminal type is now 'qt'
gnuplot> 

2D Plotting

Now we are ready to start graphing. Let’s start with the simple function.

To plot this in gnuplot, simply enter the following into your prompt:

plot x**3 

\mathring{g}

$$f(x) = x^3$$

This looks pretty much like we would expect it to. If we want to plot multiple functions to compare, we can simply add it to the plot command.

plot sin(x), cos(x)

$$f(x) = sin(x)$$

$$g(x) = cos(x)$$

3D plotting

Plotting functions in two dimensions is great, but what about three dimensional functions? Let’s see what

$$ f(x) = sin(x)*cos(y) $$

looks like in 3D. Enter the following into gnuplot:

set isosamples 50
set hidden3d
splot [0:2*pi] [0:2*pi] sin(x)*cos(y)
  • The set hidden3d command disables the wireframe, making it easier to see the contours of the 3D objects. Try it both ways with the unset hidden3d command, use whichever you prefer.
  • Setting our isosamples to 50 gives us a much smoother plot.
  • In gnuplot, the splotis identical to the plot command, except it will make a 3-dimensional plot.
  • The [0:2*pi] [0:2*pi] section specifies a domain for each of these functions, which is zero to 2π (the period of the cosine and sine functions)

After running these commands, we get

$$ f(x) = sin(x)*cos(y) $$

I would recommend checking out the gnuplot demos page, which has tons of functions and scripts to play around with. There are many more features than I could ever hope to cover here, so this is a great place to explore.

Plotting data

Say that we ran some experiments and we wanted to quickly plot the results. To keep things simple, let’s start out with a 2D graph that might be commonplace on homework assignments and research projects. First, we need our data file. Data files in gnuplot use the .d extension by default. In the case of 2 dimensions, there will be two space-separated columns for our points, with two line breaks signifying a new data block.

For this example, I using a classic classroom experiment of tracking the growth of plants over time. The left column represents the day, and the right hand is the height in inches.

# Flower number one
1 1.3
2 1.8
3 2.1
4 2.4
5 2.4
6 2.9
7 3.2


# Flower number two
1 1.0
2 1.1
3 1.6
4 2.1
5 2.6
6 3.0
7 3.3

To plot this data, we can simply run

plot 'flowers.d'

This looks OK, but it doesn’t really tell the whole story and it certainly isn’t up to research (or even science fair) standards. Let’s spruce this plot up a bit!

set title font "Helvetica,14"
set title 'Flower Growth Over Seven Days'
set xlabel 'Time (Days Elapsed)'
set ylabel "Height (Inches)"
plot 'flowers.d' index 0 w lp lw 3 title 'Flower 1', 'flowers.d' index 1 w lp lw 3 title 'Flower 2'
  • index chooses the block from the dataset to plot (each block is separated by two blank lines)
  • w lp: short for with linepoints, which styles the lines
  • lw: short for line width
  • title sets the key label for the corresponding data block

Looks much better!

Conclusion

We learned how to use gnuplot to quickly create a graph out of experimental data, as well as plot equations in two and three dimensions. I have barely scratched the surface of this program, and I will share my knowledge with you as I continue to learn. In the future, I want to explore more advanced gnuplot features such as parametric equations and data fitting. I also hope to develop an automatic gnuplot theming script, that would act like my Zathura-Pywal utility and automatically color gnuplot based on the system colors. Keep an eye out for updates!