Source code for planarity.planarity_networkx
"""NetworkX interface to planarity."""
import planarity
__all__ = ['kuratowski_subgraph', 'pgraph_graph',
'networkx_graph', 'draw']
[docs]def kuratowski_subgraph(graph):
"""Return forbidden subgraph of nonplanar graph G."""
try:
import networkx as nx
except ImportError:
raise ImportError("NetworkX required for kuratowski_subgraph()")
pgraph = planarity.PGraph(graph)
edges = pgraph.kuratowski_edges()
return nx.Graph(edges)
[docs]def networkx_graph(pgraph):
"""Return NetworkX graph built from planarity pgraph."""
try:
import networkx as nx
except ImportError:
raise ImportError("NetworkX required for networkx_graph()")
graph = nx.Graph()
graph.add_nodes_from(pgraph.nodes(data=True))
graph.add_edges_from(pgraph.edges(data=True))
return graph
[docs]def pgraph_graph(graph):
"""Return pgraph graph built from NetworkX graph."""
return planarity.PGraph(graph)
[docs]def draw(graph, labels=True):
"""Draw planar graph with Matplotlib."""
try:
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
from matplotlib.collections import PatchCollection
except ImportError:
raise ImportError("Matplotlib is required for draw()")
pgraph = planarity.PGraph(graph)
pgraph.embed_drawplanar()
hgraph = networkx_graph(pgraph)
patches = []
node_labels = {}
xs = []
ys = []
for node, data in hgraph.nodes(data=True):
y = data['pos']
xb = data['start']
xe = data['end']
x = int((xe+xb)/2)
node_labels[node] = (x, y)
patches += [Circle((x, y), 0.25)]#,0.5,fc='w')]
xs.extend([xb, xe])
ys.append(y)
plt.hlines([y], [xb], [xe])
for (_, _, data) in hgraph.edges(data=True):
x = data['pos']
yb = data['start']
ye = data['end']
ys.extend([yb, ye])
xs.append(x)
plt.vlines([x], [yb], [ye])
# labels
if labels:
for n, (x, y) in node_labels.items():
plt.text(x, y, n,
horizontalalignment='center',
verticalalignment='center',
bbox = dict(boxstyle='round',
ec=(0.0, 0.0, 0.0),
fc=(1.0, 1.0, 1.0),
)
)
p = PatchCollection(patches)
ax = plt.gca()
ax.add_collection(p)
plt.axis('equal')
plt.xlim(min(xs)-1, max(xs)+1)
plt.ylim(min(ys)-1, max(ys)+1)