I just started doing things with TikZ today and I run into a problem: there is just no example code snippets for typesetting directed, weighted graphs. Can anyone supply one simple example in an answer?
2 Answers
I made tkz-graph
and tkz-berge
to help beginners to draw some graphs. tkz-berge
is used for specials graphs (named graphs in graph theory)
You can use only tikz
to draw graphs.
Version with tkz-graph
\documentclass[]{article}
\usepackage[utf8]{inputenc}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{fullpage}
\usepackage[upright]{fourier}
\usepackage{tkz-graph}
\usetikzlibrary{arrows}
\thispagestyle{empty}
\begin{document}
\SetVertexNormal[Shape = circle,
FillColor = orange,
LineWidth = 2pt]
\SetUpEdge[lw = 1.5pt,
color = black,
labelcolor = white,
labeltext = red,
labelstyle = {sloped,draw,text=blue}]
\begin{center}
\begin{tikzpicture}
\Vertex[x=0 ,y=0]{K}
\Vertex[x=0 ,y=2]{F}
\Vertex[x=-1,y=4]{D}
\Vertex[x=3 ,y=7]{H}
\Vertex[x=8 ,y=5]{B}
\Vertex[x=9 ,y=2]{N}
\Vertex[x=5 ,y=0]{M}
\Vertex[x=3 ,y=1]{S}
\tikzset{EdgeStyle/.append style = {bend left}}
\Edge[label = $120$](K)(F)
\Edge[label = $650$](H)(S)
\Edge[label = $780$](H)(M)
\Edge[label = $490$](D)(B)
\Edge[label = $600$](D)(M)
\Edge[label = $580$](B)(M)
\Edge[label = $600$](H)(N)
\Edge[label = $490$](F)(H)
\tikzset{EdgeStyle/.append style = {bend right}}
\Edge[label = $630$](S)(B)
\Edge[label = $210$](S)(N)
\Edge[label = $230$](S)(M)
\end{tikzpicture}
\end{center}
\end{document}
With arrows on edges
\documentclass[11pt]{scrartcl}
\usepackage{tkz-graph}
\begin{document}
\begin{tikzpicture}
\SetUpEdge[lw = 1.5pt,
color = orange,
labelcolor = white]
\GraphInit[vstyle=Normal]
\SetGraphUnit{3}
\tikzset{VertexStyle/.append style={fill}}
\Vertex{P}
\NOEA(P){B} \SOEA(P){M} \NOEA(B){D}
\SOEA(B){C} \SOEA(C){L}
\tikzset{EdgeStyle/.style={->}}
\Edge[label=$3$](C)(B)
\Edge[label=$10$](D)(B)
\Edge[label=$10$](L)(M)
\Edge[label=$10$](B)(P)
\tikzset{EdgeStyle/.style={<->}}
\Edge[label=$4$](P)(M)
\Edge[label=$9$](C)(M)
\Edge[label=$4$](C)(L)
\Edge[label=$5$](C)(D)
\Edge[label=$10$](B)(M)
\tikzset{EdgeStyle/.style={<->,relative=false,in=0,out=60}}
\Edge[label=$11$](L)(D)
\end{tikzpicture}
\end{document}
update : Version with tikz
and automata
\documentclass[11pt]{scrartcl}
\PassOptionsToPackage{usenames,dvipsnames,svgnames}{xcolor}
\usepackage{tikz}
\usetikzlibrary{arrows,positioning,automata}
\begin{document}
\begin{tikzpicture}[>=stealth',shorten >=1pt,node distance=3cm,on grid,initial/.style ={}]
\node[state] (P) {$P$};
\node[state] (B) [above right =of P] {$B$};
\node[state] (M) [below right =of P] {$M$};
\node[state] (D) [above right =of B] {$D$};
\node[state] (C) [below right =of B] {$C$};
\node[state] (L) [below right =of C] {$L$};
\tikzset{mystyle/.style={->,double=orange}}
\tikzset{every node/.style={fill=white}}
\path (C) edge [mystyle] node {$3$} (B)
(D) edge [mystyle] node {$10$} (B)
(L) edge [mystyle] node {$10$} (M)
(B) edge [mystyle] node {$10$} (P);
\tikzset{mystyle/.style={<->,double=orange}}
\path (P) edge [mystyle] node {$4$} (M)
(C) edge [mystyle] node {$9$} (M)
(C) edge [mystyle] node {$4$} (D)
(B) edge [mystyle] node {$5$} (M);
\tikzset{mystyle/.style={<->,relative=false,in=0,out=60,double=orange}}
\path (L) edge [mystyle] node {$10$} (D);
\end{tikzpicture}
\end{document}
-
1It might be nice to include where these packages can be found (link) and on a personal note, is there any documentation in English? My French is not what it used to be in high school and even then it was pretty bad. Also, it may be better to add a directed example here, since the question specifically asks for it. Dec 5, 2011 at 14:26
-
TeXlive 2011, MikTeX or here ctan.org/tex-archive/macros/latex/contrib/tkz/tkz-graph. With the next version, there will be a French version. Count Zero will help me to translate ( tex.stackexchange.com/questions/35738/… ). You have some examples on my site altermundus.com/pages/tkz/graph/index.html Dec 5, 2011 at 15:49
-
That's almost what I need and I have typeset a similar undirected weighted graph using "Prim's algorithm" example from texample.net. Although, I need to include somehow a direction for each edge in the graph. Frankly, the edges should be arrows pointing from a source vertex to a destination vertex rather than simply connecting the two. Dec 6, 2011 at 11:54
-
I added an example with arrows on edges. You need to study tikz to modify sometimes the style of edges or vertices. Dec 6, 2011 at 14:48
-
Thanks for your input, Altermundus, but I cannot accept your answer as I have a lot of code purely in TikZ/PGF, and, thus, cannot afford porting to tkz-graph. Frankly, I ended up using 'automata' - TikZ-library in order to draw directed, weighted graphs (one, e.g., represented by the second image in your answer). Dec 9, 2011 at 18:00
Here is a stripped down version usking tkz-graph
of Alain Matthes's code that provides reasonable looking (math/CS paper) defaults and demonstrates some common vertex, edge, and label options.
\documentclass{article}
\usepackage{tkz-graph}
\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}
\Vertex[x=0,y=0]{K}
\Vertex[x=0,y=2]{F}
\Vertex[x=-1,y=4]{D}
\Vertex[x=3,y=7]{H}
\Vertex[x=8,y=5]{B}
\Vertex[x=9,y=2,L=$n$]{N}
\Vertex[x=5,y=0,LabelOut,Lpos=-90,Ldist=.2cm]{M}
\Vertex[x=3,y=3.5,NoLabel]{S}
\tikzstyle{LabelStyle}=[sloped]
\tikzstyle{EdgeStyle}=[]
\Edge[label=$120$,labelstyle={pos=0.3,above}](K)(F)
\Edge[label=$650$](H)(S)
\Edge[label=$780$](H)(M)
\Edge[label=$490$](D)(B)
\Edge[label=$600$](D)(M)
\Edge[label=$580$](B)(M)
\Edge[label=$600$](H)(N)
\Edge[label=$490$](F)(H)
\Loop[dir=NO,dist=2cm,label=$\beta$](B)
\tikzstyle{EdgeStyle}=[pre, bend right]
\Edge[label=$210$](S)(N)
\end{tikzpicture}
\end{figure}
\end{document}
Useful resources:
- Loops: How do you make a tkz graph with edges starting and ending at the same vertex?
- Invisible vertices: Invisible vertices with tkz-graph
- Vertex with no circle: How do I draw a graph in tikz where the vertices are only represented by the label names?
- Referencing a Vertex that has Math Typesetting inside it to make an Edge
- Fine-tuning labels with
labelstyle
(above
,sloped
,pos
, ...) Labeling Edges in a Weighted Digraph - Change bend angle and swap node position on arrow
tkz-graph's manual is in French but it contains enough English words or cognates to be decipherable. https://ctan.org/pkg/tkz-graph
tkz-graph also comes with useful built-in graph styles:
tkz-berge
. Have a look at the rest of the site as well, many great examples.tkz-berge
. Perhaps it's been retired. Is Altermundus about?