
Я пытаюсь нарисовать следующую диаграмму в TikZ:
Моя попытка выглядит так (обратите внимание, что метки узлов немного отличаются, но это не моя проблема!):
Мой код следующий:
\documentclass[11pt,a4paper]{report}
\usepackage[USenglish]{babel}
\usepackage[T1]{fontenc}
\usepackage[ansinew]{inputenc}
\usepackage{lmodern}
\usepackage{tikz}
\usetikzlibrary{positioning,fit,backgrounds,arrows,shapes,automata,petri}
\tikzset{
place/.style={
circle,
thick,
minimum size=6mm,
draw
},
transitionV/.style={
rectangle,
thick,
fill=black,
minimum height=6mm,
inner xsep=1pt
}
}
\begin{document}
\title{Test}
\author{Me}
\date{\today}
\begin{figure}[h!]
\centering
\begin{tikzpicture}[node distance=1cm and 2cm,>=stealth',bend angle=45,thick]
\node [transitionV,label=above:$q_1$] (q1) {};
\node [place,tokens=1,label=above:$\alpha_{11}(k)$] (p11) [below= of q1] {}
edge[pre,bend right,overlay] (q1)
edge[post,bend left,overlay] (q1);
\node [place,tokens=2,label=above:$\alpha_{41}(k)$] (p41) [below right=0.25cm and 2cm of q1] {}
edge[pre] (q1);
\node [transitionV,label=above:$q_4$] (q4) [below right=0.25cm and 2cm of p41] {}
edge[pre] (p41);
\node [place,label=above:$\alpha_{24}(k)$] (p24) [above right=0.25cm and 2cm of q4] {}
edge[pre] (q4);
\node [transitionV,label=above:$q_2$] (q2) [above right=0.25cm and 2cm of p24] {}
edge[pre] (p24);
\node [place,tokens=1,label=above:$\alpha_{22}(k)$] (p22) [below= of q2] {}
edge[pre,bend right,overlay] (q2)
edge[post,bend left,overlay] (q2);
\node [place,tokens=1,label=above:$\alpha_{31}(k)$] (p31) [above right=0.25cm and 2cm of q1] {}
edge[pre] (q1);
\node [transitionV,label=below:$q_3$] (q3) [above right=0.25cm and 2cm of p31] {}
edge[pre] (p31);
\node [place,label=above:$\alpha_{23}(k)$] (p23) [below right=0.25cm and 2cm of q3] {}
edge[pre] (q3)
edge[post] (q2);
\node [place,tokens=1,label=below:$\alpha_{12}(k)$] (p12) [above= of q3] {}
edge[pre,bend left,out=45,in=45,looseness=1.2] (q2)
edge[post,bend left,out=315,in=315,looseness=1.2] (q1);
\end{tikzpicture}
\caption{Event graph}
\end{figure}
\end{document}
Я исчерпал свои знания TikZ. Пожалуйста, кто-нибудь может мне подсказать, как сделать так, чтобы моя диаграмма выглядела красиво, как в примере выше? Спасибо!
решение1
Пожалуйста, задавайте конкретные вопросы о том, что вы хотите иметь, что вы пробовали и где вы не смогли этого достичь. В том виде, в котором он сейчас, он не представляет исследовательской ценности для этого сайта и просто пост типа «сделай это для меня».
Я исправил две основные проблемы, которые я видел. Остальное должно быть самоочевидно из кода, который у вас уже есть.
% arara: pdflatex
\documentclass[11pt,a4paper]{report}
\usepackage[USenglish]{babel}
\usepackage[T1]{fontenc}
\usepackage[ansinew]{inputenc}
\usepackage{lmodern}
\usepackage{tikz}
\usetikzlibrary{positioning,arrows,petri}
\tikzset{
place/.style={
circle,
thick,
minimum size=6mm,
draw
},
transitionV/.style={
rectangle,
thick,
fill=black,
minimum height=6mm,
inner xsep=1pt
}
}
\begin{document}
\begin{figure}[h!]
\centering
\begin{tikzpicture}[node distance=1cm and 2cm,>=stealth',bend angle=45,thick]
\node [transitionV,label=above:$q_1$] (q1) {};
\node [place,tokens=1,label=above:$\alpha_{11}(k)$] (p11) [below= of q1] {}
edge[pre,bend right=70] (q1)
edge[post,bend left=70] (q1);
\node [place,tokens=2,label=above:$\alpha_{41}(k)$] (p41) [below right=0.25cm and 2cm of q1] {}
edge[pre] (q1);
\node [transitionV,label=above:$q_4$] (q4) [below right=0.25cm and 2cm of p41] {}
edge[pre] (p41);
\node [place,label=above:$\alpha_{24}(k)$] (p24) [above right=0.25cm and 2cm of q4] {}
edge[pre] (q4);
\node [transitionV,label=above:$q_2$] (q2) [above right=0.25cm and 2cm of p24] {}
edge[pre] (p24);
\node [place,tokens=1,label=above:$\alpha_{22}(k)$] (p22) [below= of q2] {}
edge[pre,bend right=70] (q2)
edge[post,bend left=70] (q2);
\node [place,tokens=1,label=above:$\alpha_{31}(k)$] (p31) [above right=0.25cm and 2cm of q1] {}
edge[pre] (q1);
\node [transitionV,label=below:$q_3$] (q3) [above right=0.25cm and 2cm of p31] {}
edge[pre] (p31);
\node [place,label=above:$\alpha_{23}(k)$] (p23) [below right=0.25cm and 2cm of q3] {}
edge[pre] (q3)
edge[post] (q2);
\node [place,tokens=1,label=below:$\alpha_{12}(k)$] (p12) [above= of q3] {}
edge[pre,out=0,in=20,,looseness=1.2] (q2)
edge[post,out=180,in=160,looseness=1.2] (q1);
\end{tikzpicture}
\caption{Event graph}
\end{figure}
\end{document}
решение2
В своей попытке я изменил ваш код, отделив узлы от путей и используя arc
пути для рисования маленьких узлов по бокам. Это потому, что я считаю, что лучше организованный код легче понять, и каждый раз, когда я пишу/заканчиваю какой-то код, я трачу пару минут на исправление его структуры и удаление избыточных опций.
Линии соединяются на разных путях с помощью якорей, и в этом случае мне пришлось добавить calc
, чтобы вычислить другие позиции, чтобы достичь этого. Так, например, если у вас есть (q2.west)
и (q2.south west)
, чтобы вычислить среднюю точку, вы должны написать ($(q2.west)!.5!(q2.south west)$)
, таким образом ваша стрелка может соединиться со средней точкой между западом и юго-западом определенного узла.
Все пути также были сокращены в соответствии с вашим желаемым примером. Библиотека bending
также была добавлена для того, чтобы кончики стрелок дуг были правильно выровнены.
Выход
Код
\documentclass[11pt,a4paper]{report}
\usepackage[USenglish]{babel}
\usepackage[T1]{fontenc}
\usepackage[ansinew]{inputenc}
\usepackage{lmodern}
\usepackage{tikz}
\usetikzlibrary{positioning,fit,backgrounds,arrows,shapes,automata,petri,calc,bending}
\tikzset{
place/.style={
circle,
thick,
minimum size=6mm,
draw
},
transitionV/.style={
rectangle,
thick,
fill=black,
minimum height=6mm,
inner xsep=1pt
}
}
\begin{document}
\title{Test}
\author{Me}
\date{\today}
\begin{figure}[h!]
\centering
\begin{tikzpicture}[
node distance=1cm and 2cm,
>=stealth',
bend angle=#1,
thick,
shorten >=2pt,
shorten <=2pt
]
% Nodes
\node [transitionV,label=above:$q_1$] (q1) {};
\node [place,tokens=1,label=above:$\alpha_{11}(k)$] (p11) [below= of q1] {};
\node [place,tokens=2,label=above:$\alpha_{41}(k)$] (p41) [below right=0.25cm and 2cm of q1] {};
\node [transitionV,label=above:$q_4$] (q4) [below right=0.25cm and 2cm of p41] {};
\node [place,label=above:$\alpha_{24}(k)$] (p24) [above right=0.25cm and 2cm of q4] {};
\node [transitionV,label=above:$q_2$] (q2) [above right=0.25cm and 2cm of p24] {};
\node [place,tokens=1,label=above:$\alpha_{22}(k)$] (p22) [below= of q2] {};
\node [place,tokens=1,label=above:$\alpha_{31}(k)$] (p31) [above right=0.25cm and 2cm of q1] {};
\node [transitionV,label=below:$q_3$] (q3) [above right=0.25cm and 2cm of p31] {};
\node [place,label=above:$\alpha_{23}(k)$] (p23) [below right=0.25cm and 2cm of q3] {};
\node [place,tokens=1,label=below:$\alpha_{12}(k)$] (p12) [above= of q3] {};
% Paths
% left
\draw ($(q1.north east)!.5!(q1.east)$) edge[bend left=15,->] (p31);
\draw (q1.east) edge[bend right=15,->] (p41);
% central
\draw (p31) edge[bend left=10,->] (q3);
\draw (q3) edge[bend left=10,->] (p23);
\draw (p41) edge[bend right=10,->] (q4);
\draw (q4) edge[bend right=10,->] (p24);
% right
\draw (p23) edge[bend left=15,->] ($(q2.north west)!.5!(q2.west)$);
\draw (p24) edge[bend right=15,->] (q2.west);
% round arrows on the...
% ...left
\draw[->] ($(p11.west)+(2pt,4pt)$) arc (240:105:1.8em);
\draw[<-] ($(p11.east)+(-2pt,4pt)$) arc (-60:75:1.8em);
% ...right
\draw[->] ($(p22.west)+(2pt,4pt)$) arc (240:105:1.8em);
\draw[<-] ($(p22.east)+(-2pt,4pt)$) arc (-60:75:1.8em);
% huge round arrows from the top node
\draw[->] (p12) edge[out=180,in=145] ($(q1.north west)!.5!(q1.west)$);
\draw[->] (p12) edge[out=0,in=35] ($(q2.north east)!.5!(q2.east)$);
\end{tikzpicture}
\caption{Event graph}
\end{figure}
\end{document}