117

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}
2
  • 1
    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? Commented Jul 24, 2011 at 21:20
  • 1
    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.
    – roxrook
    Commented Jul 24, 2011 at 21:24

4 Answers 4

191

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}
8
  • 7
    Thank you for your quick response. However the picture position changes accordingly, it moves to the bottom of the page :(.
    – roxrook
    Commented Jul 24, 2011 at 20:18
  • 6
    @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
    Commented Jul 24, 2011 at 20:29
  • 2
    @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.
    – roxrook
    Commented Jul 24, 2011 at 20:33
  • 11
    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
    Commented Jul 25, 2011 at 7:22
  • 2
    If you don't want it to move then try\begin{figure}[H] where [H] is Hold Here
    – 3kstc
    Commented May 14, 2018 at 4:08
17

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}
2
  • 3
    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. Commented Dec 23, 2014 at 21:06
  • 1
    how do I label this one??
    – David
    Commented Feb 12, 2015 at 17:49
4

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}

Preview

slide with caption and confusion matrix


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.

2
  • 4
    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?
    – jon_simon
    Commented Dec 6, 2018 at 21:06
  • How can get rid of the number of the figure?
    – hola
    Commented Aug 30, 2019 at 5:36
1

If you want to have a caption, label and your tikzpicture at the exact position you wrote it without floating around, you're best of with this option:

\begin{center}
  \begin{tikzpicture}
    <code>
  \end{tikzpicture}
  \captionof{figure}{your Caption} 
  \label{fig:your Label}
\end{center}
2
  • 1
    I get an Undefined control sequence error on the command \captionof. Any advice?
    – NerdOnTour
    Commented May 29, 2023 at 8:27
  • @NerdOnTour \usepackage{caption} should solve your error Commented May 31, 2023 at 17:41

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .