28

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?

Yossi Farjoun
  • 13,274
  • 10
  • 74
  • 96
coderodde
  • 549
  • By the way, is there anything like that on TeXample? – Torbjørn T. Dec 05 '11 at 14:10
  • Have a look at: http://www.texample.net/tikz/examples/prims-algorithm/ and http://www.texample.net/tikz/examples/state-machine/. The first one is not directed but can easily be made so. The second is a state machine, but replacing the edge labels should be straightforward and you obtain a directed weighted graph. And then there is: http://www.texample.net/tikz/examples/tkz-berge/ but I don't know the status of tkz-berge. Have a look at the rest of the site as well, many great examples. – Roelof Spijker Dec 05 '11 at 14:11
  • I couldn't seem to find anything on tkz-berge. Perhaps it's been retired. Is Altermundus about? – qubyte Dec 05 '11 at 14:14
  • If I'm not mistaking, you could something like that in R, and include the graphic either via a pdf, or automatically via Sweave. – Roman Luštrik Dec 05 '11 at 14:16
  • Ah! Speak of the devil! – qubyte Dec 05 '11 at 14:17
  • @MarkS.Everitt no tkz-bergeis part of TeXLive 2011 but to draw simple graph, you need only tkz-graph texlive/2011/texmf-dist/tex/latex/tkz-graph/tkz-graph.sty. – Alain Matthes Dec 05 '11 at 14:20
  • tkz-berge appears to be part of the standard distribution now. – qubyte Dec 05 '11 at 14:20
  • @Altermundus: Oops, sorry, commented at the same time. Good to know! I like this package. :) – qubyte Dec 05 '11 at 14:22
  • Since it's not strictly an answer to the question I'll just add a comment; I would recommend using a graph layout program such as graphviz (http://www.graphviz.org/) and then an interface such as dot2tex (http://www.fauskes.net/code/dot2tex/). – AdamRedwine Dec 06 '11 at 15:56

2 Answers2

40

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} 

enter image description here

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}

enter image description here

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}

enter image description here

Alain Matthes
  • 95,075
  • 1
    It 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. – Roelof Spijker Dec 05 '11 at 14:26
  • TeXlive 2011, MikTeX or here http://www.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 ( http://tex.stackexchange.com/questions/35738/tkz-graph-inconsistency-between-edge-and-loop ). You have some examples on my site http://altermundus.com/pages/tkz/graph/index.html – Alain Matthes Dec 05 '11 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. – coderodde Dec 06 '11 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. – Alain Matthes Dec 06 '11 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). – coderodde Dec 09 '11 at 18:00
  • @user1049393 Yes I understand your point of view. I added a version of my last code written only with tikz and automata. – Alain Matthes Dec 10 '11 at 07:52
  • Is the bent edges graph a joke? – qwr Nov 17 '20 at 04:18
8

Since I just wanted something easy, here is a stripped down version using 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} % standard vertex at (0,0) with Name k \Vertex[x=0,y=2]{F} \Vertex[x=-1,y=4]{D} \Vertex[x=8,y=5]{B} \Vertex[x=9,y=2,L=$n$]{N} % custom label \Vertex[x=5,y=0,LabelOut,Lpos=-90,Ldist=.2cm]{M} % custom label position \Vertex[x=3,y=3.5,NoLabel]{S} % unlabeled \tikzstyle{LabelStyle}=[sloped] % rotate labels to match edges \Edgelabel=$120$,labelstyle={pos=0.3,above}(F) % custom label position \Edgelabel=$490$(B) \Edgelabel=$580$(M) \Loopdir=NO,dist=2cm,label=b,labelstyle={auto} % loop/self-edge \tikzstyle{EdgeStyle}=[pre, bend right] % set curved arrow style \Edgelabel=$210$(N) \end{tikzpicture} \end{figure}

\end{document}

sample graph

Useful resources:

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:

enter image description here enter image description here

qwr
  • 339