Zeichnen eines gerichteten Graphen in TIKZ mit beschrifteten Kanten und ohne Schnittpunkte

Zeichnen eines gerichteten Graphen in TIKZ mit beschrifteten Kanten und ohne Schnittpunkte

Ich zeichne einen Digraphen, um eine Matrix darzustellen.

\begin{figure}
\begin{tikzpicture}[roundnode/.style={circle, draw=black!60, fill=black!5, very thick, minimum size=7mm}]
%Nodes
\node[roundnode]      (midcircle)                              {2};
\node[roundnode]      (uppercircle)       [above=of midcircle] {1};
\node[roundnode]      (rightcircle)       [right=of midcircle] {4};
\node[roundnode]      (lowercircle)       [below=of midcircle] {3};

%Edges out of 1
\draw[->] (uppercircle.east) -- (rightcircle.north);
\draw[->] (uppercircle.west) .. controls+(left:40mm) .. (lowercircle.west);
\draw[->] (uppercircle.west) .. controls +(up:20mm) and +(right:7mm) .. (uppercircle.east);

%2 Edges out of 2
\draw[->] (midcircle.east) -- (rightcircle.west);
\draw[->] (midcircle.north) .. controls +(up:5mm) and +(right:7mm) .. (midcircle.east);
\draw[->] (midcircle.south) -- (lowercircle.north);
\draw[->] (midcircle.north) -- (uppercircle.south);

%Edges out of 3
\draw[->] (lowercircle.west) .. controls+(left:50mm) and +(up:10mm) .. (uppercircle.west);
\draw[->] (lowercircle.east) -- (rightcircle.south);
\draw[->] (lowercircle.south) .. controls +(right:7mm) ..  (lowercircle.east);


%Edges out of 4
\draw[->] (rightcircle.south) .. controls +(down:7mm) and +(right:7mm) .. (midcircle.east);

\end{tikzpicture}
\end{figure}

Dadurch entsteht

Digraph

  1. Ich würde gerne wissen, wie man Kanten einfach mit + oder - beschriftet
  2. Ich möchte schönere Kanten erstellen, die sich nicht überschneiden und symmetrischer sind. Ich bin nicht sicher, ob die Verwendung controlsdes Befehls der beste Ansatz ist. Es könnte auch besser funktionieren, wenn die Kanten nicht auf north, south, east, oder ausgehen und eintreten west. Irgendwelche Vorschläge für bessere Methoden?

Antwort1

Hier ist der mit der Bibliothek gezeichnete Automat automata. Ich habe alle Kanten mit Buchstaben beschriftet, um sie im Code leichter identifizieren zu können, aber Sie können natürlich auch etwas wie node{\texttt{+}}oder verwenden node{$+$}.

Bildbeschreibung hier eingeben

\documentclass[border=2mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{automata,positioning}
\begin{document}
\begin{tikzpicture}%
  [>=stealth,
   shorten >=1pt,
   node distance=2cm,
   on grid,
   auto,
   every state/.style={draw=black!60, fill=black!5, very thick}
  ]
\node[state] (mid)                  {2};
\node[state] (upper) [above=of mid] {1};
\node[state] (right) [right=of mid] {4};
\node[state] (lower) [below=of mid] {3};

\path[->]
%   FROM       BEND/LOOP           POSITION OF LABEL   LABEL   TO
   (upper) edge[bend left]     node                      {a} (right)
           edge[bend right=80] node[swap,very near start]{b} (lower)
           edge[loop above]    node                      {c} (upper)
   (mid)   edge[bend left=10]  node                      {d} (right)
           edge[loop left]     node                      {e} (mid)
           edge                node                      {f} (lower)
           edge                node                      {g} (upper)
   (lower) edge[bend left=70]  node[swap,very near start]{h} (upper)
           edge[bend right]    node[swap]                {i} (right)
           edge[loop below]    node                      {j} (lower)
   (right) edge[bend left=10]  node                      {k} (mid)
   ;
\end{tikzpicture}
\end{document}

Antwort2

Ich weiß nicht, ob ich Ihre Frage vollständig verstanden habe, aber hier ist eine Lösung. Sicherlich nicht die beste.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{automata,arrows,calc,positioning}

\begin{document}

\begin{figure}
\begin{tikzpicture}[roundnode/.style={circle, draw=black!60, fill=black!5, very thick, minimum size=7mm}]
%Nodes
\node[roundnode]      (midcircle)                              {2};
\node[roundnode]      (uppercircle)       [above=of midcircle] {1};
\node[roundnode]      (rightcircle)       [right=of midcircle] {4};
\node[roundnode]      (lowercircle)       [below=of midcircle] {3};

%Edges out of 1
\draw[->] (uppercircle.east) to[bend left=20] node[above right]{-}(rightcircle.north);
\draw[->] (uppercircle.-135) to[bend right=40] node[right]{-}(lowercircle.135);
\draw[->] (uppercircle.135) to[out=135,in=180] ($(uppercircle) +(0,3em)$)node[above]{+} to[out=0, in =45] (uppercircle.45);

%2 Edges out of 2
\draw[->] (midcircle.east) --node[above]{+} (rightcircle.west);
\draw[->] (midcircle.80) to[out=80,in=135] ($(midcircle) +(2em,2em)$)node[right]{+}  to[out=-45, in =10] (midcircle.10);
\draw[->] (midcircle.south) -- (lowercircle.north);
\draw[->] (midcircle.north) -- (uppercircle.south);

%Edges out of 3
\draw[->] (lowercircle.150) to[bend left=80]node[left]{+}(uppercircle.-150);
\draw[->] (lowercircle.east) to[bend right=20]node[below right]{-}(rightcircle.south);
\draw[->] (lowercircle.-135)  to[out=-135,in=180] ($(lowercircle) +(0,-3em)$)node[below]{+} to[out=0, in =-45](lowercircle.-45);


%Edges out of 4
\draw[->] (rightcircle.-135) to[bend left=20] node[below]{-} (midcircle.-45);

\end{tikzpicture}
\end{figure}

\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen