Graphviz#

Graph- und Digraph-Objekte haben eine _repr_svg_()-Methode, sodass sie direkt in einem Jupyter-Notebook gerendert und dargestellt werden können.

Einfaches Beispiel#

[1]:
import graphviz
[2]:
dot = graphviz.Digraph('hello-pythonistas', comment='Hello world example')

dot.edge('Hello', 'Pythonistas!')

dot
[2]:
../../_images/matplotlib_graphviz_examples_3_0.svg

Ihr könnt euch auch den Quelltext ausgeben lassen mit:

[3]:
print(dot.source)
// Hello world example
digraph "hello-pythonistas" {
        Hello -> "Pythonistas!"
}

Auch die Ausgabe des Kommentars oder anderer Elemente des Quelltexts sind möglich, z.B. mit:

[4]:
print(dot.comment)
Hello world example

Ihr könnt auch Daten aus einem pandas DataFrame verwenden, z.B.:

[5]:
import pandas as pd

j = {'action': ['single use', 'teamwork', 'convert', 'Java, R, Julia etc.', 'extend'],
     'view': ['Jupyter', 'JupyterHub', 'nbconvert', 'kernels', 'extensions']}

df = pd.DataFrame(j)

df
[5]:
action view
0 single use Jupyter
1 teamwork JupyterHub
2 convert nbconvert
3 Java, R, Julia etc. kernels
4 extend extensions
[6]:
jm = graphviz.Graph('jupyter_moons', comment='Jupyter moons')

jm.node('What do you want to do?')

for index, row in df.iterrows():
    jm.edge('What do you want to do?', str(row["view"]), label=(str(row["action"])))

jm
[6]:
../../_images/matplotlib_graphviz_examples_10_0.svg

Styling#

Ihr könnt graph_attr-, node_attr- und edge_attr-Argumente der Graph- und Digraph-Konstuktoren verwenden, um die Standardattribute von Graphviz für eure Graphen, Knoten und Kanten zu ändern, z.B.:

[7]:
dot = graphviz.Digraph('hello-pythonistas',
                       comment='Hello world example',
                       node_attr={'shape': 'plaintext'})

dot.edge('Hello', 'Pythonistas!')

dot
[7]:
../../_images/matplotlib_graphviz_examples_12_0.svg

Die graph_attr-, node_attr- und edge_attr-Argumente können auch auf Instanzen angewendet werden:

[8]:
dot.graph_attr['rankdir'] = 'LR'

dot
[8]:
../../_images/matplotlib_graphviz_examples_14_0.svg

Um att_stmt-Attributanweisungen direkt hinzuzufügen, ruft die attr()-Methode der Graph- oder Digraph-Instanz mit dem gewünschten Ziel als erstes Argument und den Attributen als Schlüsselwort-Argument auf.

Hinweis:

Attribut-Anweisungen wirken sich auf alle späteren Graphen, Knoten oder Kanten innerhalb desselben (Sub-)Graphen aus.

Engines#

Neben Dot können auch verschiedene andere Layout Engines verwendet werden.

[9]:
pvl = graphviz.Graph('python_visualisation_landscape', engine='neato')

pvl.edge('Matplotlib', 'pandas')
pvl.edge('pandas', 'GeoPandas')
pvl.edge('Matplotlib', 'Geoplot')
pvl.edge('Matplotlib', 'descartes')
pvl.edge('Matplotlib', 'seaborn')
pvl.edge('Matplotlib', 'ggpy')
pvl.edge('Matplotlib', 'plotnine')
pvl.edge('Matplotlib', 'scikit_plot')

pvl
[9]:
../../_images/matplotlib_graphviz_examples_17_0.svg

Ihr könnt auch das engine-Attribut einer bestehenden Instanz ändern:

[10]:
pvl.engine = 'circo'

pvl
[10]:
../../_images/matplotlib_graphviz_examples_19_0.svg

Eine vollständige Übersicht über die Engines erhaltet ihr mit:

[11]:
for engine in sorted(graphviz.ENGINES):
    print(engine)
circo
dot
fdp
neato
osage
patchwork
sfdp
twopi

Dateien schreiben und lesen#

[12]:
graphviz.Source.save(dot)
[12]:
'hello-pythonistas.gv'
[13]:
graphviz.Source.from_file('hello-pythonistas.gv')
[13]:
../../_images/matplotlib_graphviz_examples_24_0.svg

Dot-Dateien konvertieren#

Eine Dot-Datei kann in ein anderes Format, z.B. PDF, PNG, SVG etc., umgewandelt werden mit render:

[14]:
from graphviz import render

render('dot', 'svg', 'hello-pythonistas.gv')
[14]:
'hello-pythonistas.gv.svg'