# How to add caption for a TikZ picture?

I'm drawing a automaton figure, and I want to name it says 'M1' below the figure? A minimal example would be greatly appreciated. Thank you.

\begin{tikzpicture}[shorten >=1pt,node distance=2cm,on grid,auto]
\node[state,initial]    (q_0)                   {$q_0$};
\node[state,accepting]  (q_1)   [right=of q_0]  {$q_1$};
\node[state]            (q_2)   [right=of q_1]  {$q_2$};

\path[->]
(q_0) edge                  node {a}            (q_1)
(q_1) edge                  node {$\lambda$}    (q_2)
(q_2) edge  [bend right]    node {$\lambda$}    (q_0)
; %end path
\end{tikzpicture}

• Do you need a real caption like for figures with a running counter or just some text below it? You self-answer lets me goes it's the second case. In the first case should the pictures be labeled on their own, independent from the figures? – Martin Scharrer Jul 24 '11 at 21:20
• The text below a picture is what I needed, as provided in my answer. The reason that I used the word caption is because I googled and found that. I thought it was similar to a caption for a picture. There are two pictures being drawn next to each other, so I think the text solution is easier to manage in this particular situation. Nonetheless, I would agree with you on the first solution for a true caption for a picture. – Chan Jul 24 '11 at 21:24

## 3 Answers

Just include your code in a figure environment. In that way you'll be able to add a caption to it as a normal figure:

\begin{figure}
\centering
\begin{tikzpicture}
<code>
\end{tikzpicture}
\caption{M1} \label{fig:M1}
\end{figure}

• Thank you for your quick response. However the picture position changes accordingly, it moves to the bottom of the page :(. – Chan Jul 24 '11 at 20:18
• @Chan: Everything with caption should usually be a floating object, i.e. it should be automatically moved to the typographically most sensible position. That is what figure does. If you really don't want a float, then have a look at tex.stackexchange.com/questions/7210/…. – Caramdir Jul 24 '11 at 20:29
• @Caramdir: Thank you. In fact, I've just found a more elegant solution in the TikZ manual by using an extra \node with text. Unfortunately, the compiler was freeze for some reasons. – Chan Jul 24 '11 at 20:33
• If you don't like the position of the figure you can specify it in the optional argument of the figure environment like that: \begin{figure}[t]. Instead of t (top) you can use b (bottom), p (new page of floats) or h (here) or a combination of them. All of these options works well if LaTeX thinks that the result would be typographically correct. – Spike Jul 25 '11 at 7:22
• If you don't want it to move then try\begin{figure}[H] where [H] is Hold Here – 3kstc May 14 '18 at 4:08

This is my solution using an extra node with text, it works pretty well.

\begin{tikzpicture}[shorten >=1pt,node distance=2cm,on grid,auto]
\node[state,initial]    (q_1)                           {$q_1$};
\node[state,accepting]  (q_2)   [right=of q_1]          {$q_2$};
\node[state]            (q_3)   [below right=of q_1]    {$q_3$};

\path[->]
(q_1) edge  [bend left]     node {a}            (q_2)
(q_1) edge  [loop above]    node {b}            (q_1)
(q_2) edge  [bend left]     node {a,b}          (q_3)
(q_3) edge  [bend left]     node {a}            (q_2)
(q_3) edge  [bend left]     node {b}            (q_1);

\node [below=1cm, align=flush center,text width=8cm] at (q_3)
{
$M_1$
};
\end{tikzpicture}

• The problem with your solution is that, when you want to included a figure with a caption that is not a tikz picture, the caption might be laid out quite differently, especially if your publisher has his/her own style for captions in a class or package file. For consistency of captioning, Spike's solution is my strong preference. – Benjamin McKay Dec 23 '14 at 21:06
• how do I label this one?? – David Feb 12 '15 at 17:49

I've a similar solution using caption:

\usepackage{caption}


where in a beamer slide I would add caption via:

\captionof{figure}{\textbf{Confusion Matrix}}


as in:

\begin{frame}[fragile]
\frametitle{Confusion Matrix}
\begin{tikzpicture}[
box/.style={draw,rectangle,minimum size=2cm,text width=1.5cm,align=left}]
\matrix (conmat) [row sep=.1cm,column sep=.1cm] {
\node (tpos) [box,
label=left:$$\mathbf{p'}$$,
label=above:$$\mathbf{p}$$,
] {True \\ positive};
&
\node (fneg) [box,
label=above:\textbf{n},
label=above right:\textbf{total},
label=right:$$\mathrm{P}'$$] {False \\ negative};
\\
\node (fpos) [box,
label=left:$$\mathbf{n'}$$,
label=below left:\textbf{total},
label=below:P] {False \\ positive};
&
\node (tneg) [box,
label=right:$$\mathrm{N}'$$,
label=below:N] {True \\ negative};
\\
};
\node [left=.05cm of conmat,text width=1.5cm,align=right] {\textbf{actual \\ value}};
\node [above=.05cm of conmat] {\textbf{prediction outcome}};
\end{tikzpicture}
\captionof{figure}{\textbf{Confusion Matrix}}
\end{frame}


# Simplified

For readability, without tikz code:

\begin{frame}[fragile]
\frametitle{Confusion Matrix}
\begin{tikzpicture}[
% ... tikz ...
\end{tikzpicture}
\captionof{figure}{\textbf{Confusion Matrix}}
\end{frame}


The confusion matrix code comes from this answer.

• Should be the top answer, simple single-line command. Maybe remove all of that extraneous confusion matrix code, since it's just obscuring the (correct) answer? – Jonathan Simon Dec 6 '18 at 21:06
• How can get rid of the number of the figure? – pushpen.paul Aug 30 at 5:36