109

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? 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.
    – Chan
    Jul 24, 2011 at 21:24

4 Answers 4

176

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 :(.
    – Chan
    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
    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.
    – Chan
    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
    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
    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. Dec 23, 2014 at 21:06
  • 1
    how do I label this one??
    – David
    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
  • 3
    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
    Dec 6, 2018 at 21:06
  • How can get rid of the number of the figure?
    – hola
    Aug 30, 2019 at 5:36
0

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}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.