4

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}
5

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

2

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

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.