It is quite usual in scientific texts that one needs to places several graphs next to each other for a better comparison. In general this leads to a “matrix style” placement of the graphs. Let us discuss the ways how to get it in LaTeX.
In general case, when the graphs are *,eps files (e.g. exported from Origin, Qtiplot or similar program), one achieves the proper placement by:
\usepackage{graphicx}
…
\begin{figure}
\includegraphics[width=0.5\linewidth]{“”}
\includegraphics[width=0.5\linewidth]{“”}
~
\includegraphics[width=0.5\linewidth]{“”}
\includegraphics[width=0.5\linewidth]{“”}
\end{figure}
This way seems to be the easiest, however it shares all the disadvantages, that embedding of the external pictures has:
- possibly “foreign” fonts with wrong size,
- the sizes and axes of the graphs should be properly chosen,
- more difficult to maintain certain “style” among several graphs,
Using TikZ/PGF package solves these problems, however it is mandatory, that the used data is already “prepared” for visualizing in external program.
In the following examples I use PGFplots, package built on top of PGF for easier plotting.
Something like:
\usepackage{pgfplots}
…
\begin{tikzpicture}
\begin{axis}
\addplot coordinates {(0,2) (2,0)}; %Or, whatever plot you want
\end{axis}
\end{tikzpicture}
is enough to plot you wonderful data…
However, the consequent usage of axis environment creates overlapping plots, what can be used for multi-axes plots with different abscissae and ordinates:
\begin{tikzpicture}
\begin{axis}[xmin=0,xmax=2,ymin=0,ymax=2,
axis y line*=left,
axis x line*=top,]
\addplot[blue] coordinates {(0,2) (2,0)};
\end{axis}
\begin{axis}[xmin=0,xmax=4,ymin=0,ymax=4,
axis y line*=right,
axis x line*=bottom,]
\addplot[red] coordinates {(0,0) (4,4)};
\end{axis}
\end{tikzpicture}
To produce a picture with grouped plots one could name the axis environments and grouping them as nodes:
\begin{tikzpicture}
\begin{axis}[name=plot1]
\addplot[blue] coordinates {(0,2) (2,0)};
\end{axis}
\begin{axis}[name=plot2,,at={($(plot1.east)+(1cm,0)$)},anchor=west]
\addplot[red] coordinates {(0,0) (4,4)};
\end{axis}
\end{tikzpicture}
However, there is a library, called groupplots, that can automate a bit the grouping procedure and reduce amount of code. The following is a previous block of code rewritten with usage of this library:
\usepgfplotslibrary{groupplots}
…
\begin{tikzpicture}
\begin{groupplot}[group style={columns=2,rows=1},]
\nextgroupplot % 1
\addplot[blue] coordinates {(0,2) (2,0)};
\nextgroupplot % 2
\addplot[red] coordinates {(0,0) (4,4)};
\end{groupplot}
\end{tikzpicture}
where columns times rows defines maximum number of plots, so define it properly.
The caveat is that there is no direct way to alter automatic plot positioning safe for \nextgroupplot[group/empty plot], which effectively skips this particular plot position.
However, one can have workaround for this issue.
Each \nextgroupplot inside current tikzpicture environment can be references as a node, e.g. :
\draw[thick,>=latex,->,red] (group c1r1.center) node {1.} — (group c2r1.center) node {2.};
Will connect center of the plots with an arrow.
Thus we come to he most important part of the whole text, 2 plots, each of them with 2 different axes:
\begin{tikzpicture}
\begin{groupplot}[group style={columns=2,rows=2},]
\nextgroupplot[axis y line*=left,axis x line*=bottom,] % 1
\addplot[blue] coordinates {(0,2) (2,0)};
\nextgroupplot[axis y line*=left,axis x line*=bottom,] % 2
\addplot[blue] coordinates {(0,0) (3,3)};
\nextgroupplot[at=(group c1r1.north),axis y line*=right,axis x line*=top,] % 1, 2nd axis
\addplot[red] coordinates {(0,0) (2,3)};
\nextgroupplot[at=(group c2r1.north),axis y line*=right,axis x line*=top] % 2, 2nd axis
\addplot[red] coordinates {(0,3) (4,0)};
\end{groupplot}
\draw[thick,,red,shorten >=4pt,shorten <=4pt]
(group c1r1.center) node {1.} —
(group c2r1.center) node {2.};
\end{tikzpicture}
Happy plotting your data! :-)
Thank you, this helped a lot.