¿Cómo hago para que Tikz haga una flecha curva de un nodo a otro cuando mis nodos están en línea recta?

¿Cómo hago para que Tikz haga una flecha curva de un nodo a otro cuando mis nodos están en línea recta?

tengo este codigo

\documentclass[10pt]{article}

\usepackage{tikz}
\usetikzlibrary{arrows}

\begin{document}

\begin{tikzpicture}[->,>=stealth',auto,node distance=3cm,
  thick,main node/.style={circle,draw,font=\sffamily\Large\bfseries}]

  \node[main node] (1) {a};
  \node[main node] (2) [right of=1] {b};
  \node[main node] (3) [right of=2] {c};
  \node[main node] (4) [right of=3] {d};

  \path[every node/.style={font=\sffamily\small}]
    (1) edge node [right] {} (2)
    (2) edge node [right] {} (3)
    (3) edge node [right] {} (4)
    (4) edge node [left] {} (1);
\end{tikzpicture}
\end{document}

que produce este gráfico:

mal grafico

Mi objetivo es producir un gráfico como este:

buen grafico

Perdón por el mal dibujo. Probé varias combinaciones (4) edge node [bend left] {} (1);y (4) edge node [loop left] {} (1);fue en vano.

Respuesta1

Solo para mostrar otro enfoque, este caso de uso es exactamente para lo que se crearon las claves bend lefty :bend right

\documentclass[10pt]{article}

\usepackage{tikz}
\usetikzlibrary{arrows}

\begin{document}

\begin{tikzpicture}[->,>=stealth',auto,node distance=3cm,
  thick,main node/.style={circle,draw,font=\sffamily\Large\bfseries}]

  \node[main node] (1) {a};
  \node[main node] (2) [right of=1] {b};
  \node[main node] (3) [right of=2] {c};
  \node[main node] (4) [right of=3] {d};

  \path[every node/.style={font=\sffamily\small}]
    (1) edge node [right] {} (2)
    (2) edge node [right] {} (3)
    (3) edge node [right] {} (4)
    (4) edge[bend right] node [left] {} (1);
\end{tikzpicture}
\end{document}

ingrese la descripción de la imagen aquí

Estas claves también aceptan un <angle>valor opcional para configurar simultáneamente las claves iny outsimétricamente, por lo que escribir

(4) edge[bend right=90] node [left] {} (1);

resultará en

ingrese la descripción de la imagen aquí

Si se requiere un ajuste asimétrico de las teclas iny ,outsolución de cfres el camino a seguir.

Respuesta2

Un enfoque es utilizar \drawy especificar los ángulos entrantes y salientes. Simplemente especificando los nombres de los nodos se construirá la ruta con respecto al centro del nodo (aunque no se dibujará desde allí). También puede especificar anclajes de nodo. Por ejemplo, la línea roja conecta (4.north)con (1.north).

\documentclass[10pt]{article}
\usepackage{tikz}
\usetikzlibrary{arrows}

\begin{document}
\begin{tikzpicture}[->,>=stealth',auto,node distance=3cm,
  thick,main node/.style={circle,draw,font=\sffamily\Large\bfseries}]
\node[main node] (1) {a};
\node[main node] (2) [right of=1] {b};
\node[main node] (3) [right of=2] {c};
\node[main node] (4) [right of=3] {d};

\draw [->] (1) -- (2);
\draw [->] (2) -- (3);
\draw [->] (3) -- (4);
\draw [->] (4) to [out=150,in=30] (1);
\draw [->,red] (4.north) to [out=150,in=30] (1.north);
\end{tikzpicture}
\end{document}

ingrese la descripción de la imagen aquí

Respuesta3

Hay varias formas de dibujar curvas, si esa es la cuestión. Aquí hay uno:

\documentclass[tikz]{standalone}

\usetikzlibrary{arrows}

\begin{document}

\begin{tikzpicture}
  [
    ->,
    >=stealth',
    auto,node distance=3cm,
    thick,
    main node/.style={circle, draw, font=\sffamily\Large\bfseries}
    ]

  \node[main node] (1) {a};
  \node[main node] (2) [right of=1] {b};
  \node[main node] (3) [right of=2] {c};
  \node[main node] (4) [right of=3] {d};

  \path[every node/.style={font=\sffamily\small}]
    (1) edge node [right] {} (2)
    (2) edge node [right] {} (3)
    (3) edge node [right] {} (4);
  \draw
    (4) [out=150, in=20] to  (1);
\end{tikzpicture}
\end{document}

curva hacia atrás

Aquí hay una manera de hacerlo parte del original \pathusando edge(y variando un poco los ángulos):

  \path[every node/.style={font=\sffamily\small}]
    (1) edge node [right] {} (2)
    (2) edge node [right] {} (3)
    (3) edge node [right] {} (4)
    (4) edge [out=150, in=90]  (1);

borde en curvas de trayectoria

información relacionada