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