Создание направленного графа с некоторой косметической структурой

Создание направленного графа с некоторой косметической структурой

Используя Tikz, я хотел бы создать график, подобный следующему:

график

Итак, я хотел бы иметь классический направленный граф, где в каждом узле есть какой-то текст. Более того, с каждым узлом связана одна рамка, и рамка заполнена кучей маркеров.

Кроме того, три необязательных, но желательных свойства:

  • Все узлы имеют одинаковый размер. Также было бы здорово, если бы они могли правильно удерживать текст внутри себя, таким образом, размер узлов корректировался бы относительно узла с самым большим текстом.

  • Возможность установки рамки в желаемом положении узла (см. разницу между 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 без дополнительных вертикальных интервалов и левого поля.

Связанный контент