表面的な構造を持つ有向グラフを作成する

表面的な構造を持つ有向グラフを作成する

Tikz を利用して、次のようなグラフを作成したいと思います。

グラフ

そこで、各ノードにテキストがある、古典的な有向グラフを作成したいと思います。さらに、各ノードには 1 つのフレームが関連付けられており、そのフレームには多数の箇条書きが記入されています。

さらに、オプションではあるが望ましい 3 つのプロパティ:

  • ノードはすべて同じサイズです。ノード内にテキストを適切に保持できれば、最も大きなテキストを含むノードに合わせてノードのサイズが調整されるので、さらに便利です。

  • フレームをノードの希望の位置に配置できます (グラフの A、C と B の違いを参照)。座標ごとの配置の代わりに、上、下、左、右などのオプション セットと、それらの組み合わせで十分です。

  • 箇条書きの数に応じてフレーム サイズが調整されます (グラフからフレーム サイズの変化を確認してください)。

現在の私の知識では、ノードとエッジで構成される一般的な有向グラフしか作成できません。ドキュメントを読んで、これらすべてを実現する方法(方法があると仮定)を見つけようとしますが、誰かが手を貸してくれると非常にありがたいです。

答え1

いくつかのスタイルを用意すれば準備完了です:

\documentclass{article}
\usepackage{enumitem}
\usepackage{tikz}
\usetikzlibrary{positioning}

\newlist{tikzitem}{itemize}{1}
\setlist[tikzitem,1]{label=$\bullet$,nolistsep,leftmargin=*}

\begin{document}

\begin{tikzpicture}[
mynode/.style={
  circle,
  draw,
  fill=yellow,
  minimum size=1cm,
  align=center
  },
frame/.style={
  draw=cyan,
  line width=3pt,
  text width=2cm,
  rounded corners
  },
ar/.style={
  ->,
  >=latex
  }    
]
\node[mynode] (a) {Some text};
\node[mynode,below right=2cm and 6cm of a]  (c) {Some text};
\node[mynode,below left=2cm and 6cm of c]  (b) {Some text};

\node[frame,anchor=north west] at (a.-90) 
  {%
  \begin{tikzitem} 
  \item First.
  \item Second.
  \item Third.
  \end{tikzitem}%
  };
\node[frame,anchor=south west] at (b.90) 
  {%
  \begin{tikzitem} 
  \item First.
  \item Second.
  \item Third.
  \end{tikzitem}%
  };
\node[frame,anchor=west] at (c.0) 
  {%
  \begin{tikzitem} 
  \item First.
  \item Second.
  \item Third.
  \item Fourth.
  \item Fifth.
  \end{tikzitem}%
  };

\draw[ar] (a) to[bend left] (c);  
\draw[ar] (b) to[bend right] (c);  
\end{tikzpicture}

\end{document}

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

円に対するフレームの位置は、at (<name>.<angle>)構文とフレームの適切なアンカーを使用して制御できます。

このenumitemパッケージを使用して、余分な垂直方向のスペースと左余白のない itemize のカスタマイズされたバージョンを作成しました。

関連情報