This material describes gnuplot version 5 (up to 5.4)
FAQ version: December 2021
PDF version of current document: http://www.gnuplot.info/faq/faq.pdf.
The newest version of this document is on the web at http://www.gnuplot.info/faq/.
Send comments, suggestions etc to the developer mailing list mailto://gnuplot-beta@lists.sourceforge.net.
gnuplot is a command-driven plotting program. It can be used interactively to plot functions and data points in both two- and three-dimensional plots in many different styles and many different output formats. Gnuplot can also be used as a scripting language to automate generation of plots. It is designed primarily for the visual display of scientific data. gnuplot is copyrighted, but freely distributable; you don’t have to pay for it. You are welcome to download the source code.
The authors of gnuplot are: Thomas Williams, Colin Kelley, Russell Lang, Dave Kotz, John Campbell, Gershon Elber, Alexander Woo and many others.
The following quote comes from Thomas Williams:
I was taking a differential equation class and Colin was taking Electromagnetics, we both thought it’d be helpful to visualize the mathematics behind them. We were both working as sys admin for an EE VLSI lab, so we had the graphics terminals and the time to do some coding. The posting was better received than we expected, and prompted us to add some, albeit lame, support for file data.
Any reference to GNUplot is incorrect. The real name of the program is "gnuplot". You see people use "Gnuplot" quite a bit because many of us have an aversion to starting a sentence with a lower case letter, even in the case of proper nouns and titles. gnuplot is not related to the GNU project or the FSF in any but the most peripheral sense. Our software was designed completely independently and the name "gnuplot" was actually a compromise. I wanted to call it "llamaplot" and Colin wanted to call it "nplot." We agreed that "newplot" was acceptable but, we then discovered that there was an absolutely ghastly pascal program of that name that the Computer Science Dept. occasionally used. I decided that "gnuplot" would make a nice pun and after a fashion Colin agreed.
Yes. Gnuplot can read in files containing additional commands during an interactive session, or it can be run in batch mode by piping a pre-existing file or a stream of commands to stdin. Gnuplot is used as a back-end graphics driver by higher-level mathematical packages such as Octave and can easily be wrapped in a cgi script for use as a web-driven plot generator. Gnuplot supports context- or data-driven flow control and iteration using familiar statements if else continue break while for.
Gnuplot is in widespread use on many platforms, including MS Windows, linux, unix, and OSX. The current source code retains supports for older systems as well, including VMS, Ultrix, OS/2, and MS-DOS. However 16-bit platforms are no longer supported.
You should be able to compile the gnuplot source more or less out of the box in any reasonably standard (ANSI/ISO C, POSIX) environment.
Gnuplot is authored by a collection of volunteers, who cannot make any legal statement about the compliance or non-compliance of gnuplot or its uses. There is no warranty whatsoever. Use at your own risk.
Gnuplot is freeware in the sense that you don’t have to pay for it. You can use or modify gnuplot as you like, however certain restrictions apply to further distribution of modified versions. Please read and abide by the modification and redistribution terms in the Copyright file. Some individual source files are explicitly dual-licensed; in those cases alternative terms for redistribution of code in that specific file are listed at the head of the file.
Gnuplot is neither written nor maintained by the FSF. At one time it was distributed by the FSF but this is no longer true. Gnuplot as a whole is not covered by the GNU General Public License (GPL).
See the main gnuplot web page http://www.gnuplot.info.
Some documentation and tutorials are available in other languages than English. See http://gnuplot.sourceforge.net/help.html, section "Localized learning pages about gnuplot", for the most up-to-date list.
The current stable version of gnuplot is 5.4, first released in July 2020. Incremental versions (patchlevel 1, 2, ...) are typically released every six months. The development version of gnuplot is currently 5.5.
The best place to start is http://www.gnuplot.info. From there you find various pointers to other sites, including the project development site on SourceForge http://sourceforge.net/projects/gnuplot.
The source distribution ("gnuplot-5.4.0.tar.gz" or a similar name) is available from the official distribution site http://sourceforge.net/projects/gnuplot.
The current development version will generally include features that are not yet part of the most recent stable release of gnuplot.
The development version of gnuplot is held in a git repository which you can clone as shown below to inspect or build an executable program from the source.
Questions related to the development version should go to mailto://gnuplot-beta@lists.sourceforge.net.
Read the release notes and files README and INSTALL. You will need C and C++ compilers and installed versions of various support libraries depending on what configuration options you choose and what terminal types you want your executable to support.
Full documentation is included in the release distribution as a PDF file. Individual sections can be browsed from inside a gnuplot session by typing help keyword. Documentation in other formats can be compiled from source in the docs subdirectory.
Online copies in English and Japanese are available at http://gnuplot.sourceforge.net/documentation.html.
There is a directory of worked examples in the the source distribution. These examples and the resulting plots may also be found online at http://gnuplot.sourceforge.net/demo/.
Given that you have a compiled version of gnuplot , you can use the show command to display a list of configuration and build options that were used to build your copy. The output formats (a.k.a. "terminals") built into your copy of gnuplot are reported by set terminal.
Give the help command at the initial prompt. After that, keep looking through the keywords. Good starting points are help plot and help set.
When asking a question, always mention the gnuplot version and operating system you are using. If you are asking about a plot that did not come out the way you expected, please try to show a minimal set gnuplot commands that produce a plot showing the problem.
The output format produced by a plot command is determined by a prior set terminal command. For non-interactive output you should pair this with a set output command to provide a file name.
As an example, the following session first plots a graph of sin(x) to the screen and then redraws that same plot as a PDF output file. Note: the PDF plot may not look exactly like the plot on the screen.
If the start point is not the default interactive terminal you can accomplish the same thing using push and pop
Some interactive terminal types (win, wxt, qt) provide a printer icon on their toolbar. This widget prints the current plot or saves it to file using generic system tools rather than by using a different gnuplot terminal type. That is, the file you get by selecting "save to png" in the print menu may be different than the file you get from set term png; replot;. In general a plot saved in this way will more closely reproduce the screen image than a plot generated from the command line by changing the terminal type.
Basically, you save your plot to a file in a format your word processor can understand, and then you read in the plot from your word processor. Vector formats (PostScript, emf, svg, pdf, TeX, LaTeX) should be preferred, as you can scale your graph later to the right size.
Use set term to get a list of available file formats.
Many word processors can use Encapsulated PostScript (*.eps) for graphs. You can generate eps output in gnuplot using either set terminal postscript eps or set terminal epscairo . Gnuplot does not embed a bitmap preview image in the output eps file. To accommodate some word processors you may have to add a preview image yourself using an external tool before importing it into the word processor.
Some applications, including the LibreOffice and Microsoft Office suites, can handle vector images in EMF format. These can be either produced by the emf terminal, or by selecting ’Save as EMF...’ from the toolbar of the windows terminal plot window.
LibreOffice can also read SVG, as well as AutoCAD’s dxf format.
There are many ways to use gnuplot to produce graphs for inclusion in a TeX or LaTeX document. Some terminals produce *.tex fragments for direct inclusion; others produce *.eps, *.pdf, *.png output to be included using the \includegraphics command. The epslatex and cairolatex terminals produce both a graphics file (*.eps or *.pdf) and a *.tex document file that refers to it. The tikz terminal produces full text and graphics to a pdf file when the output is processed with pdflatex.
Most word processors can import bitmap images (png, pbm, etc). The disadvantage of this approach is that the resolution of your plot is limited by the size of the plot at the time it is generated by gnuplot , which is generally a much lower resolution than the document will eventually be printed in.
This depends on the terminal type you use.
Use the save "filename" and load "filename" commands.
Gnuplot version 5 supports named blocks of data in "here document" format:
Once the named block has been defined, it can be used as many times as you like.
Data can also be provided in-line as part of a plot command using the pseudo-file "-". In this case the data can only be used once.
If your operating system supports the popen() function, you can filter input data through another program or system utility as part of the plot command.
This mechanism is particularly powerful in combination with the unix-derived command line utilities awk, sort and grep.
On systems supporting pipes, you can pipe commands to gnuplot from other programs. Many applications with gnuplot as the graphics engine, like Octave (http://www.octave.org), uses this method. This also works from a cgi script to drive gnuplot from a forms-based web page.
When you issue a plot or splot command with multiple components, gnuplot will by default cycle through a set of colors and linetypes. You can override this by providing specific color or linetype properties in the plot command or you can change the default sequence. Each of the commands below accepts many additional parameters
test displays the active colors, line and point properties, etc for the current terminal type
set color or set monochrome selects a pre-defined sequence.
set linetype changes the properties of an existing linetype or adds a new one.
set palette changes the color palette used for pm3d modes such as heat maps.
set pointsize scales all points by an additional factor
There are two relevant commands. set hidden3d affects surfaces drawn using the 3D plot style splot ... with lines. It also clips line segments created by other 3D plot styles that are occluded by those surfaces. However it does not handle plots generated in pm3d mode. This includes styles with pm3d, with zerror, with boxes, and miscellaneous plot elements generated while set pm3d is in effect. Hidden surface removal for these plots is achieved instead by drawing them in order of their distance from the viewer, controlled by set pm3d depthorder.
Specify the position of the top, bottom, left, and right borders in terms of their fractional position within the page:
The command you want is set multiplot. The program can place a specified number of plots on a regular grid (set mulplot layout <rows>, <columns> ...) or you can position them one by one using set origin and set size.
Try set size square or set view equal xy.
Try set palette cubehelix.
By specifying ? as a data value, as in
See also set missing. See also set datafile commentschars for specifying comment characters in data files.
This can be specified with various options for the command plot, for example plot ’a.dat’ every 2. If you want to draw a line through every point but only draw a point symbol at every nth point, then try plot ’a.dat’ with linespoints pointinterval n.
Depending on context, the main methods are:
Gnuplot has trouble estimating how much space to the left of the plot will be required to hold the Y axis label if it is printed horizontally (set ylabel norotate). This is particularly true if there is TeX markup in the label string. To work around this problem you can place the text in a numbered label rather than in ylabel.
Gnuplot versions through release 5.4 support only one terminal type (gif) that directly outputs an animated file:
The development version (5.5) also supports animation in webp format. Have a look at http://gnuplot.sourceforge.net/demo/animate2.html in the demo collection.
Implicit graphs or curves cannot be plotted directly in gnuplot . However there is a workaround.
The trick is to draw the single contour line z=0 of the surface z=f(x,y), and store the resulting contour curve to a temporary file or datablock.
A plot with filled area between two functions f(x) and g(x) can be obtained using the pseudo file ’+’ with plot style filledcurves.
Note that this code fragment fills area between the two curves regardless of which one is above the other. If you want to fill only the area satisfying g(x)<f(x) or f(x)<g(x) add an additional keyword above or below after filledcurves.
The command set view map adjusts the view angle and scaling such that subsequent 3D graphs made with splot have approximately the same layout as a 2D graph made with plot, with the x axis horizontal and the y axis vertical. Version 5.4 commands set view projection xz and set view projection yz similarly initialize layouts for 2D projection of the xz or yz plane, with the z axis horizontal and the x or y axis vertical.
Use the explicit option of the pm3d style:
Labeling individual contours in a contour plot used to require special tricks and extra processing steps in gnuplot version 4. In version 5 it is much simpler. Plot the contours twice, once "with lines" and once "with labels". To make the labels stand out it may help to use
Gnuplot supports various clustered and stacked histogram styles to display pre-tabulated data. It also offers a few options for accumulating raw data into bins, which can in turn be displayed as a bar chart. See the documentation for bins and for smooth frequency.
Pie charts are sort of difficult in gnuplot , but see http://gnuplot.sourceforge.net/demo/circles.html, or have a look at http://gnuplot-tricks.blogspot.com/2009/08/pie-charts-entirely-in-gnuplot.html.
The demo collection contains an example of a simple Gantt chart.
Yes. 2D plots can have separate x axes at the bottom (x1) and top (x2), and separate y axes at the left (y1) and right (y2). Version 5 offers a plot mode with parallelaxes that allows any number of additional y axes to be defined.
Version 5.4: plot style with polygons can handle polygonal faces (triangles, rectangles, octagons, ...). In earlier versions the best you can do is to describe colored facets of a 3D object in a file organized like this:
Notice the single and double blank lines. Also notice that the triangle really has four vertices of which two are identical. This is because the pm3d code only knows how to deal with quadrangles. <cN> is an optional color.
Then plot it by (either of splot’s):
Gnuplot is not a 3D modeling program. The depthorder rendering will not handle inter-penetrating facets. For true 3D rendering you would be probably be better off using a ray-tracing program.
Give the desired range immediately before each function being plotted. For example, to plot experimental data and two different functional models f1 and f2 covering two different portions of the domain:
If the data input to splot is arranged such that each line contains the same number of data points (using blank lines as delimiters, as usual), splot will by default treat the data as describing a surface. If you want to draw individual lines instead, try some combination of unset surface, set surface explicit, plot ... nosurface.
Here is one way:
Gnuplot version 5 defaults to "enhanced text" mode, in which text markup is indicated by a set of special characters embedded in the text.
Enhanced Text Control Codes | |||
Control | Example | Result | Explanation |
^ | a^x | ax | superscript |
_ | a_x | ax | subscript |
@ | a@^b_{cd} | acdb | phantom box (occupies no width) |
& | d&{space}b | d b | inserts space of specified length |
~ | ~a{.8-} | ă | overprints ’-’ on ’a’, raised by .8 |
times the current fontsize | |||
{/Times abc} | abc | print abc in font Times at current size | |
{/Times*2 abc} | abc | print abc in font Times at twice current size | |
{/Times:Italic abc} | abc | print abc in font Times with style italic | |
{/Arial:Bold=20 abc} | abc | print abc in boldface Arial font size 20 | |
To exempt a particular text string from this processing mode use the keyword noenhanced. For example we don’t want to interpret file names as subscripts:
Yes.
Unfortunately there are some circumstances where it very cumbersome to use, notably in generating PostScript output. If you are working in a UTF-8 computing environment, you probably do not have to do anything special in gnuplot to use it. If you are not, then you can still tell gnuplot to use UTF-8 when creating output: set encoding utf8.
If you cannot enter UTF-8 characters on your keyboard you will have to solve that outside of gnuplot. Or you can use octal escape sequences to type them in byte-by-byte, or (version 5.4) unicode escape sequences like ' U+221E (∞). If your keyboard does generate UTF-8 but you don’t know what keystrokes would produce a specific character, there are probably suitable character selection apps for your desktop (e.g. KDE kcharselect, or GNOME Character Map).
The most straightforward way is to use a UTF-8 font, and type in the ℏ character (Unicode ' U+210F) directly.
PostScript: PostScript does not handle utf8 easily so you must use an approximation based on enhanced text markup and possibly a special Symbol font:
@{/=56 -} {/=24 h} or {/=8 @{/Symbol=24 -} _{/=14 h}} In the latter, the "-" (a long one in /Symbol) is non-spacing and 24-pt. The 14-pt "h" is offset by an 8-pt space (which is the space preceding the "_") but smaller, since it’s written as a subscript. But these don’t look too much like the hbar we’re used to, since the bar is horizontal instead of sloped. Another possibility is {/=14 @^{/Symbol=10 -}{/=14 h}}.
The reduced Planck’s constant can be set very easily by using the AMS-LaTeX PostScript fonts which are available from http://www.ams.org/tex/amsfonts.html (also included in many LaTeX distributions). Gnuplot (see help fontpath) and the PostScript interpreter (usually Ghostscript) have to know where the file msbm10.pfb (or msbm10.pfa) resides. Use {/MSBM10 ' 175} to produce ' hslash which is a "h" superimposed by a sloped bar. The standard ' hbar (horizontal bar) has the octal code 176. Please note that h-bar exists only as an italic type.
As with Planck’s constant, the most straightforward way is to use a UTF-8 font, and type in the ⊙ character (Unicode ' U+2299 ; "circled dot operator") directly. The very similar glyph at (Unicode code point ' U+2609 ; "sun") may be even better, but not many fonts provide it.
The old-style way is to use enhanced text mode to switch to a specialize font, e.g. the Adobe "Symbol" font, that maps the characters you want onto ascii letters ’a’, ’b’, etc. This may still be necessary for PostScript output. However a much simpler way is to select UTF-8 encoding and enter the special characters just as you would any other text. This obviates the need to change fonts and gives you access to all unicode code points including CJK character sets. To actually print or view the files produced by gnuplot you still need appropriate fonts installed on your computer or output device. Gnuplot itself does not provide fonts.
The various LaTeX terminal types (latex, epslatex, tikz, context, cairolatex) hand off text generation to LaTeX. In this case you can use normal LaTeX markup like $' alpha_{3}$ .
If you are stuck using a non-utf8 encoding you should use 8-bit character codes together with the appropriate encoding option to obtain accented characters like ü or in your labels. You can represent the 8-bit code with an escape sequence. See the following example:
Everyone else should use UTF-8, where these are normal characters.
Most terminal types allow you to specify a starting font face and size. The "enhanced text" mode allows you to change fonts, text sizes, bold and italic styles within a plot.
To see a list of the available graphic drivers for your installation of gnuplot , type set term.
Some graphics drivers are included in the normal distribution but are not built by default. If you want to use them, you’ll have to recompile from source.
First, try to see whether it actually is a bug, or whether it is a feature you can turn off with some obscure set command.
Next, see whether you have an old version of gnuplot ; if so, chances are the bug has been fixed in a newer release.
Before submitting a bug report, please check whether the bug in question has already been fixed in the upstream source since the release of the current version. These are marked "pending-fixed" on the bug tracker.
If, after checking these things, you still are convinced that there is a bug please report it using the bug-tracker at http://sourceforge.net/p/gnuplot/bugs. Be sure to include the version of gnuplot (including patchlevel) and the operating system you are running it on. It helps a lot if you can provide a simple script that reproduces the error.
The tracker on sourceforge is for reporting bugs and collecting bug fixes that will appear in a subsequent release. The various online forums are better places to ask about work arounds or actually solving gnuplot related problems.
gnuplot by itself is not very well suited for heavy numerical computation. On the other hand it can easily handle very large data sets (millions of points). If you have a specific application where the limitation is gnuplot’s speed in evaluating a non-trivial function, it might be worth coding this function in C or C++ and making it a loadable plugin that gnuplot can call.
Programs you might look into if you need intensive numerical computation:
octave (http://www.octave.org) is a high-level language primarily intended for numerical computations. Octave is licensed under GPL, and in principle, it is a free Matlab clone. It provides a convenient command line interface for solving linear and nonlinear problems numerically. By the way, octave uses gnuplot as its plotting engine, so you get a data-processing program on top of gnuplot .
scilab (http://www.scilab.org) is another open source alternative to matlab.
julia + Gaston (http://github.com/mbaz/Gaston.jl) The Julia language is designed for numerical analysis and computational science. Gaston is a julia package that provides an interface to gnuplot for graphical output.
See above. You may have to use another program or write a custom plugin.
Most of the interactive terminals support both pre-defined and user-defined hotkeys to replot, toggle plot elements, change axis scaling, and so on. Hit h in an active gnuplot plot window to get list of hotkeys. Read help mouse and help bind for more information.
Join the gnuplot beta test mailing list by sending a mail containing the line subscribe gnuplot-beta in the body (not the subject) of the mail to mailto://Majordomo@lists.sourceforge.net.
Gnuplot does not do font handling by itself; it must necessarily leave that to the individual device support libraries. Unfortunately, this means that different terminal types need different help in finding fonts. Here are some quick hints. For more detailed information please see the gnuplot documentation for the specific terminal type you are having problems with.
You may also get an error message about "slow font initialization". This is because qt relies on a shared system font cache. If you request a font that no one else is using, it takes a while to update the cache. This mostly happens on Windows or OSX, because other programs on those systems tend to use a different font mechanism so the relevant font cache may be empty. Try invoking gnuplot with command line option –slow.
You do set pm3d; splot ’a.dat’ and no plot but colorbox appears. Perhaps there is no blank line in between two subsequent scans (isolines) in the data file? Add blank lines! If you are curious what this means, then don’t hesitate to look to files like demo/glass.dat or demo/triangle.dat in the gnuplot demo directory.
You can find useful the following awk script (call it e.g. addblanks.awk) which adds blank lines to a data file whenever number in the first column changes:
Then, either preprocess your data file by command awk -f addblanks.awk <a.dat or plot the datafile under a unixish
platform by
gnuplot > splot "<awk -f addblanks.awk a.dat".
For some purposes Gnuplot treats numbers less than 1e-08 as being zero. Thus, if you are trying to plot a collection of very small numbers, they may be plotted as zero. Worse, if you’re plotting on a log scale, they will be off scale. Or, if the whole set of numbers is "zero", your range may be considered empty:
The solution is to change gnuplot’s idea of "zero":
For more information, type help set zero.
Gnuplot only retains enough information to regenerate the most recent plot or splot command. In order to reproduce the entire multiplot you need to save the complete sequence of commands that generated it into a script file. Then you can load that script into gnuplot as many times as you need for replotting the drawing to different terminals or output files.
The same problem arises when you resize a multiplot displayed in an interactive terminal window, because the resize event normally triggers a replot. The qt and wxt terminals provide a toggle in the toolbox widget that suppresses this replot on resize. The x11 terminal provides a terminal option set term x11 noreplotonresize.
Gnuplot does integer, and not floating point, arithmetic on integer expressions. For example, the expression 1/3 evaluates to zero. If you want floating point expressions, supply trailing dots for your floating point numbers. Example:
This way of evaluating integer expressions is shared by both C and Fortran.
You may need to flush the output and close the file with set output or unset output).
Some output formats (postscript, pdf, latex, ...) can include several pages of plots in a single output file. For these output modes, gnuplot leaves the file open after each plot so that you can add additional plots to it. The file is not completed and made available to external applications until you issue a set or unset output command, select a different terminal type (set term), or exit gnuplot.
One common cause is that gnuplot exits immediately after drawing, the plot window closes when gnuplot exits, and it all happens too fast for you see the plot. There are several solutions to this:
Here is a short Perl-script showing two of these fixes:
This FAQ was initially compiled by John Fletcher with contributions from Russell Lang, John Campbell, David Kotz, Rob Cunningham, Daniel Lewart and Alex Woo. Reworked by Thomas Koenig from a draft by Alex Woo, with corrections and additions from Alex Woo, John Campbell, Russell Lang, David Kotz and many corrections from Daniel Lewart. Again reworked for gnuplot 3.7 by Alexander Mai and Juergen v.Hagen with corrections by Lars Hecking, Hans-Bernhard Broecker and others. Revised for gnuplot version 4 by Petr Mikulík and Ethan Merritt. Revised for gnuplot version 5 by Ethan Merritt.