The pgfplots
package is a powerful tool, based on tikz
, dedicated to create scientific graphs.
Contents |
Pgfplots is a visualization tool to make simpler the inclusion of plots in your documents. The basic idea is that you provide the input data/formula and pgfplots does the rest.
\begin{tikzpicture} \begin{axis} \addplot[color=red]{exp(x)}; \end{axis} \end{tikzpicture} %Here ends the furst plot \hskip 5pt %Here begins the 3d plot \begin{tikzpicture} \begin{axis} \addplot3[ surf, ] {exp(-x^2-y^2)*x}; \end{axis} \end{tikzpicture}
Since pgfplot is based on tikz the plot must be inside a tikzpicture environment. Then the environment declaration \begin{axis}
, \end{axis}
will set the right scaling for the plot, check the Reference guide for other axis environments.
To add an actual plot, the command \addplot[color=red]{log(x)};
is used. Inside the squared brackets some options can be passed, in this case we set the colour of the plot to red; the squared brackets are mandatory, if no options are passed leave a blank space between them. Inside the curly brackets you put the function to plot. Is important to remember that this command must end with a semicolon ;.
To put a second plot next to the first one declare a new tikzpicture environment. Do not insert a new line, but a small blank gap, in this case hskip 10pt
will insert a 10pt-wide blank space.
The rest of the syntax is the same, except for the \addplot3 [surf,]{exp(-x^2-y^2)*x};
. This will add a 3dplot, and the option surf inside squared brackets declares that it's a surface plot. The function to plot must be placed inside curly brackets. Again, don't forget to put a semicolon ; at the end of the command.
Note: It's recommended as a good practice to indent the code - see the second plot in the example above - and to add a comma , at the end of each option passed to \addplot
. This way the code is more readable and is easier to add further options if needed.
Open an example of the pgfplots package in Overleaf
To include pgfplots in your document is very easy, add the next line to your preamble and that's it:
\usepackage{pgfplots}
Some additional tweaking for this package can be made in the preamble. To change the size of each plot and also guarantee backwards compatibility (recommended) add the next line:
\pgfplotsset{width=10cm,compat=1.9}
This changes the size of each pgfplot figure to 10 centimeters, which is huge; you may use different units (pt, mm, in). The compat parameter is for the code to work on the package version 1.9 or later.
Since LaTeX was not initially conceived with plotting capabilities in mind, when there are several pgfplot figures in your document or they are very complex, it takes a considerable amount of time to render them. To improve the compiling time you can configure the package to export the figures to separate PDF files and then import them into the document, add the code shown below to the preamble:
\usepgfplotslibrary{external}
\tikzexternalize
See this help article for further details on how to set up tikz-externalization in your Overleaf project.
Open an example of the pgfplots package in Overleaf
Pgfplots 2D plotting functionalities are vast, you can personalize your plots to look exactly what you want. Nevertheless, the default options usually give very good result, so all you have to do is feed the data and LaTeX will do the rest:
To plot mathematical expressions is really easy:
\begin{tikzpicture} \begin{axis}[ axis lines = left, xlabel = $x$, ylabel = {$f(x)$}, ] %Below the red parabola is defined \addplot [ domain=-10:10, samples=100, color=red, ] {x^2 - 2*x - 1}; \addlegendentry{$x^2 - 2x - 1$} %Here the blue parabloa is defined \addplot [ domain=-10:10, samples=100, color=blue, ] {x^2 + 2*x + 1}; \addlegendentry{$x^2 + 2x + 1$} \end{axis} \end{tikzpicture}
Let's analyse the new commands line by line:
axis lines = left
.
xlabel = $x$
and ylabel = {$f(x)$}
.
\addplot
.
domain=-10:10
.
samples=100
.
\addlegendentry{$x^2 - 2x - 1$}
.
To add another graph to the plot just write a new \addplot
entry.
Open an example of the pgfplots package in Overleaf
Scientific research often yields data that has to be analysed. The next example shows how to plot data with pgfplots:
\begin{tikzpicture} \begin{axis}[ title={Temperature dependence of CuSO$_4\cdot$5H$_2$O solubility}, xlabel={Temperature [\textcelsius]}, ylabel={Solubility [g per 100 g water]}, xmin=0, xmax=100, ymin=0, ymax=120, xtick={0,20,40,60,80,100}, ytick={0,20,40,60,80,100,120}, legend pos=north west, ymajorgrids=true, grid style=dashed, ] \addplot[ color=blue, mark=square, ] coordinates { (0,23.1)(10,27.5)(20,32)(30,37.8)(40,44.6)(60,61.8)(80,83.8)(100,114) }; \legend{CuSO$_4\cdot$5H$_2$O} \end{axis} \end{tikzpicture}
There are some new commands and parameters here:
title={Temperature dependence of CuSO$_4\cdot$5H$_2$O solubility}
.
xmin=0, xmax=100, ymin=0, ymax=120
.
xtick={0,20,40,60,80,100}, ytick={0,20,40,60,80,100,120}
.
legend pos=north west
.
ymajorgrids=true
.
xmajorgrids
to enable grid lines on the x axis.
grid style=dashed
.
mark=square
.
coordinates {(0,23.1)(10,27.5)(20,32)...}
If the data is in a file, which is the case most of the time; instead of the commands \addplot
and coordinates
you should use \addplot table {file_with_the_data.dat}
, the rest of the options are valid in this environment.
Open an example of the pgfplots package in Overleaf
Scatter plots are used to represent information by using some kind of marks, these are common, for example, when computing statistical regression. Lets start with some data, the sample below is to show the structure of the data file we are going to plot (see the end of this section for a link to the LaTeX source and the data file):
GPA ma ve co un
3.45 643 589 3.76 3.52
2.78 558 512 2.87 2.91
2.52 583 503 2.54 2.4
3.67 685 602 3.83 3.47
3.24 592 538 3.29 3.47
2.1 562 486 2.64 2.37
The next example is a scatter plot of the first two columns in this table:
\begin{tikzpicture} \begin{axis}[ enlargelimits=false, ] \addplot+[ only marks, scatter, mark=halfcircle*, mark size=2.9pt] table[meta=ma] {scattered_example.dat}; \end{axis} \end{tikzpicture}
The parameters passed to the axis and addplot environments can also be used in a data plot, except for scatter. Below the description of the code:
enlarge limits=false
only marks
scatter
meta
parameter explained below.
mark=halfcircle*
mark size=2.9pt
table[meta=ma]{scattered_example.dat};
Open an example of the pgfplots package in Overleaf
Bar graphs (also known as bar charts and bar plots) are used to display gathered data, mainly statistical data about a population of some sort. Bar plots in pgfplots are highly customisable, but here we are going to show an example that 'just works':
\begin{tikzpicture} \begin{axis}[ x tick label style={ /pgf/number format/1000 sep=}, ylabel=Year, enlargelimits=0.05, legend style={at={(0.5,-0.1)}, anchor=north,legend columns=-1}, ybar interval=0.7, ] \addplot coordinates {(2012,408184) (2011,408348) (2010,414870) (2009,412156)}; \addplot coordinates {(2012,388950) (2011,393007) (2010,398449) (2009,395972)}; \legend{Men,Women} \end{axis} \end{tikzpicture}
The figure starts with the already explained declaration of the tikzpicture and axis environments, but the axis declaration has a number of new parameters:
x tick label style={/pgf/number format/1000 sep=}
\addplot
commands within this axis environment, they will fit and look nice together with no further tweaks (the ybar
parameter described below is mandatory for this to work).
enlargelimits=0.05
.
legend style={at={(0.5,-0.2)}, anchor=north,legend columns=-1}
ybar interval=0.7,
The coordinates
in this kind of plot determine the base point of the bar and its height.
The labels on the y-axis will show up to 4 digits. If in the numbers you are working with are greater than 9999 pgfplot will use the same notation as in the example.
Open an example of the pgfplots package in Overleaf
pgfplots has the 3d Plotting capabilities that you may expect in a plotting software.
There's a simple example about this at the introduction, let's work on something slightly more complex:
\begin{tikzpicture} \begin{axis}[ title=Exmple using the mesh parameter, hide axis, colormap/cool, ] \addplot3[ mesh, samples=50, domain=-8:8, ] {sin(deg(sqrt(x^2+y^2)))/sqrt(x^2+y^2)}; \addlegendentry{$\frac{sin(r)}{r}$} \end{axis} \end{tikzpicture}
Most of the commands here have already been explained, but there are 3 new things:
hide axis
colormap/cool
mesh
Note: When working with trigonometric functions pgfplots uses degrees as default units, if the angle is in radians (as in this example) you have to use de deg
function to convert to degrees.
Open an example of the pgfplots package in Overleaf
In pgfplots is possible to plot contour plots, but the data has have to be pre calculated by an external program. Let's see:
\begin{tikzpicture} \begin{axis} [ title={Contour plot, view from top}, view={0}{90} ] \addplot3[ contour gnuplot={levels={0.8, 0.4, 0.2, -0.2}} ] {sin(deg(sqrt(x^2+y^2)))/sqrt(x^2+y^2)}; \end{axis} \end{tikzpicture}
This is a plot of some contour lines for the same equation used in the previous section. The value of the title parameter is inside curly brackets because it contains a comma, so we use the grouping brackets to avoid any confusion with the other parameters passed to the \begin{axis}
declaration. There are two new commands:
view={0}{90}
contour gnuplot={levels={0.8, 0.4, 0.2, -0.2}}
levels
is a list of values of elevation levels where the contour lines are to be computed.
Open an example of the pgfplots package in Overleaf
To plot a set of data into a 3d surface all we need is the coordinates of each point. These coordinates could be an unordered set or, in this case, a matrix:
\begin{tikzpicture} \begin{axis} \addplot3[ surf, ] coordinates { (0,0,0) (0,1,0) (0,2,0) (1,0,0) (1,1,0.6) (1,2,0.7) (2,0,0) (2,1,0.7) (2,2,1.8) }; \end{axis} \end{tikzpicture}
The points passed to the coordinates
parameter are treated as contained in a 3 x 3 matrix, being a white row space the separator of each matrix row.
All the options for 3d plots in this article apply to data surfaces.
Open an example of the pgfplots package in Overleaf
The syntax for parametric plots is slightly different. Let's see:
\begin{tikzpicture} \begin{axis} [ view={60}{30}, ] \addplot3[ domain=0:5*pi, samples = 60, samples y=0, ] ({sin(deg(x))}, {cos(deg(x))}, {x}); \end{axis} \end{tikzpicture}
There are only two new things in this example: first, the samples y=0
to prevent pgfplots from joining the extreme points of the spiral and; second, the way the function to plot is passed to the addplot3
environment. Each parameter function is grouped inside curly brackets and the three parameters are delimited with parenthesis.
Open an example of the pgfplots package in Overleaf
Command/Option/Environment | Description | Possible Values |
---|---|---|
axis | Normal plots with linear scaling | |
semilogxaxis | logaritmic scaling of x and normal scaling for y | |
semilogyaxis | logaritmic scaling for y and normal scaling for x | |
loglogaxis | logaritmic scaling for the x and y axes | |
axis lines | changes the way the axes are drawn. default is 'box | box, left, middle, center, right, none |
legend pos | position of the legend box | south west, south east, north west, north east, outer north east |
mark | type of marks used in data plotting. When a single-character is used, the character appearance is very similar to the actual mark. | *, x , +, |, o, asterisk, star, 10-pointed star, oplus, oplus*, otimes, otimes*, square, square*, triangle, triangle*, diamond, halfdiamond*, halfsquare*, right*, left*, Mercedes star, Mercedes star flipped, halfcircle, halfcircle*, pentagon, pentagon*, cubes. (cubes only work on 3d plots). |
colormap | colour scheme to be used in a plot, can be personalized but there are some predefined colormaps | hot, hot2, jet, blackwhite, bluered, cool, greenyellow, redyellow, violet. |
For more information see: