116

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}
morbusg
  • 25,490
  • 4
  • 81
  • 162
roxrook
  • 9,907
  • 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? – Martin Scharrer Jul 24 '11 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 Jul 24 '11 at 21:24

4 Answers4

189

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}
Spike
  • 6,729
  • 7
    Thank you for your quick response. However the picture position changes accordingly, it moves to the bottom of the page :(. – roxrook Jul 24 '11 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 http://tex.stackexchange.com/questions/7210/label-and-caption-without-float. – Caramdir Jul 24 '11 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 Jul 24 '11 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 '11 at 07:22
  • @Spike: Although your comment was posted for a while, I still want to thank you for that. – roxrook Aug 06 '11 at 00:12
  • 1
    When a node is used for positioning, I find the caption is at a different location to the image. – user4417 Jan 22 '16 at 12:59
  • 2
    If you don't want it to move then try\begin{figure}[H] where [H] is Hold Here – 3kstc May 14 '18 at 04:08
  • The caption needs to be adjusted. I am not sure how. I am using minipage environment. I have tried all of the options stated above but the caption position can not be adjusted. – user3582228 Jan 03 '22 at 08:58
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}
roxrook
  • 9,907
  • 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. – Benjamin McKay Dec 23 '14 at 21:06
  • 1
    how do I label this one?? – David Feb 12 '15 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.

Konrad
  • 279
  • 3
  • 12
  • 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 Dec 06 '18 at 21:06
  • How can get rid of the number of the figure? – hola Aug 30 '19 at 05: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}