5

I am trying to draw a Markov chain using tikz. The diagram is in the correct setup except the arrow going from State 2 and 3 overlaps two other arrows. I tried repositioning the states using node distance but that did not seem to work. How can I force the arrows not to overlap? Markov Chain

%latex
\documentclass[reqno]{amsart}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{hyperref}
\usepackage{pgfplots}

\usepgfplotslibrary{fillbetween}

\usepackage{tikz}
\usetikzlibrary{automata}
\usetikzlibrary{positioning}  %                 ...positioning nodes
\usetikzlibrary{arrows}       %                 ...customizing arrows
\tikzset{node distance=4.5cm, % Minimum distance between two nodes. Change if necessary.
         every state/.style={ % Sets the properties for each state
           semithick,
           fill=gray!10},
         initial text={},     % No label on start arrow
         double distance=4pt, % Adjust appearance of accept states
         every edge/.style={  % Sets the properties for each transition
         draw,
           ->,>=stealth',     % Makes edges directed with bold arrowheads
           auto,
           semithick}}

\begin{document}

\begin{figure}[htb]
\centering
\begin{tikzpicture}
\node[state] (s1) {State 1};
\node[state, below right of=s1] (s2) {State 2};
\node[state, below left of=s1] (s3) {State 3};

\draw (s1) edge[loop above] node {} (s1);
\draw (s1) edge[bend left] node {} (s2);
\draw (s1) edge[bend right] node {} (s3);

\draw (s2) edge[bend left] node {} (s1);
\draw (s2) edge[loop right] node {} (s2);
\draw (s2) edge[bend right] node {} (s3);

\draw (s3) edge[bend right] node {} (s1);
\draw (s3) edge[bend right] node {} (s2);
\draw (s3) edge[loop left] node {} (s3);

\end{tikzpicture}
\end{figure}

\end{document}

2 Answers 2

7

bend left and bend right come with parameters, the bending angles. Adjusting them allows you to avoid the intersections. (BTW, I also removed packages that were not used. Note also that the arrows library got superseded by arrows.meta but I kept arrows for now.)

\documentclass[reqno]{amsart}
\usepackage{tikz}
\usetikzlibrary{automata}
\usetikzlibrary{positioning}  %                 ...positioning nodes
\usetikzlibrary{arrows}       %                 ...customizing arrows
\tikzset{node distance=4.5cm, % Minimum distance between two nodes. Change if necessary.
         every state/.style={ % Sets the properties for each state
           semithick,
           fill=gray!10},
         initial text={},     % No label on start arrow
         double distance=4pt, % Adjust appearance of accept states
         every edge/.style={  % Sets the properties for each transition
         draw,
           ->,>=stealth',     % Makes edges directed with bold arrowheads
           auto,
           semithick}}

\begin{document}

\begin{figure}[htb]
\centering
\begin{tikzpicture}
\node[state] (s1) {State 1};
\node[state, below right of=s1] (s2) {State 2};
\node[state, below left of=s1] (s3) {State 3};

\draw (s1) edge[loop above]  (s1);
\draw (s1) edge[bend left]  (s2);
\draw (s1) edge[bend right]  (s3);

\draw (s2) edge[bend left=12]  (s1);
\draw (s2) edge[loop right]  (s2);
\draw (s2) edge[bend right=12]  (s3);

\draw (s3) edge[bend right=12]  (s1);
\draw (s3) edge[bend right]  (s2);
\draw (s3) edge[loop left]  (s3);

\end{tikzpicture}
\end{figure}
\end{document}

enter image description here

3

you can reduce default value of bend angle. just add bend angle=15 to your tikzset (similarly @marmoth change it locally for two arrows bend).

off topic:

  • for labeling of arrows is handy to use quotes library and than wrote it as for example ... (s1) edge["label",bend left] (s2).
  • package hyperref had to be load last in preamble (except in rare cases)

    \documentclass[reqno]{amsart}
    \usepackage{amsmath, amssymb}
    
    \usepackage{pgfplots}         % it load tikz too
    \pgfplotsset{compat=1.16}
    \usetikzlibrary{automata,
                    arrows.meta,    %   ...customizing arrows
                    positioning,    %   ...positioning nodes
                    quotes}         % For edge labels
    \usepgfplotslibrary{fillbetween}
    \tikzset{node distance=4.5cm,   % Minimum distance between nodes. Change if necessary.
             every state/.style={   % Sets the properties for each state
                    semithick,
                    fill=gray!10},
             initial text={},       % No label on start arrow
             double distance=4pt,   % Adjust appearance of accept states
             every edge/.style={    % Sets the properties for each transition
                    draw,
                    semithick,
                    -Stealth,       % Makes edges directed with bold arrowheads
                    auto},
             bend angle=15          % Reduce default bend angle
             }
    
    \usepackage{hyperref}           % had to be last in preamble
    
    \begin{document}
        \begin{figure}[htb]
        \centering
    \begin{tikzpicture}[]
    \node[state] (s1) {State 1};
    \node[state, below right of=s1] (s2) {State 2};
    \node[state, below left of=s1] (s3) {State 3};
    
    \draw   (s1) edge[loop above]   (s1)
            (s1) edge[bend left]    (s2)
            (s1) edge[bend right]   (s3)
    %
            (s2) edge[bend left]    (s1)
            (s2) edge[loop right]   (s2)
            (s2) edge[bend right]   (s3)
    %
            (s3) edge[bend right]   (s1)
            (s3) edge[bend right]   (s2)
            (s3) edge[loop left]    (s3);
    \end{tikzpicture}
        \end{figure}
    \end{document}
    

enter image description here

You must log in to answer this question.

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