ノードが直線上にある場合、Tikz で 1 つのノードから別のノードに曲線矢印を作成するにはどうすればよいですか?

ノードが直線上にある場合、Tikz で 1 つのノードから別のノードに曲線矢印を作成するにはどうすればよいですか?

このコードを持っています

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

このグラフが生成されます:

悪いグラフ

私の目標は次のようなグラフを作成することです。

良いグラフ

下手な絵でごめんなさい。(4) edge node [bend left] {} (1);とをいろいろ組み合わせて試してみましたが、(4) edge node [loop left] {} (1);うまくいきませんでした。

答え1

別のアプローチを示すために、このユースケースはまさにキーbend leftとが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}

ここに画像の説明を入力してください

これらのキーは、オプションの値を受け入れ、キーとキーを対称的<angle>に同時に設定することもできるので、次のように記述します。inout

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

結果的に

ここに画像の説明を入力してください

inとキーの非対称設定outが必要な場合は、CFRのソリューションそれが正しい道です。

答え2

1 つの方法は、 を使用し\draw、入ってくる角度と出ていく角度を指定することです。ノード名を指定するだけで、ノードの中心を基準にパスが構築されます (ただし、そこから描画されるわけではありません)。ノード アンカーを指定することもできます。たとえば、赤い線(4.north)は に接続します(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}

ここに画像の説明を入力してください

答え3

曲線を描く方法はいくつかあります。その方法の 1 つを以下に示します。

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

後ろに反る

\pathこれをオリジナルの一部にする方法は次のとおりですedge(角度を少し変えて)。

  \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);

パス曲線のエッジ

関連情報