An undirected graph

This makes the simple point that you don’t have to have directions on your edges; you can have undirected graphs. (Also, the nodes don’t need to have labels!)

import daft
import itertools

# Instantiate the PGM.
pgm = daft.PGM(node_unit=0.4, grid_unit=1, directed=False)

for i, (xi, yi) in enumerate(itertools.product(range(1, 5), range(1, 5))):
    pgm.add_node(str(i), "", xi, yi)

for e in [
    (4, 9),
    (6, 7),
    (3, 7),
    (10, 11),
    (10, 9),
    (10, 14),
    (10, 6),
    (10, 7),
    (1, 2),
    (1, 5),
    (1, 0),
    (1, 6),
    (8, 12),
    (12, 13),
    (13, 14),
    (15, 11),
]:
    pgm.add_edge(str(e[0]), str(e[1]))

# Render and save.
pgm.render()
<Axes: >
../../_images/463c9bd96e2412d986bc0b50976b4f11059e22e01e0f3280653d7e0286001a2f.png