Home > Software design >  Draw shapes on top of Networkx graph
Draw shapes on top of Networkx graph

Time:12-30

Given an existing networkx graph

import networkx as nx
import numpy as np

np.random.seed(123)

graph = nx.erdos_renyi_graph(5, 0.3, seed=123, directed=True)
nx.draw_networkx(graph)

enter image description here

or

import networkx as nx

G = nx.path_graph(4)
nx.spring_layout(G)
nx.draw_networkx(G)

enter image description here

how can you draw a red circle on top of (in the same position as) one of the nodes, like the node labeled 1?

CodePudding user response:

To be able to draw a networkx graph, each node needs to be assigned a position. By default, nx.spring_layout() is used to calculate positions when calling nx.draw_networkx(), but these positions aren't stored. They are recalculated each time the function is drawn, except when the positions are explicitly added as a parameter.

Therefore, you can calculate these positions beforehand, and then use these to plot circles:

import matplotlib.pyplot as plt
from matplotlib.colors import to_rgba
import networkx as nx
import numpy as np

np.random.seed(123)
graph = nx.erdos_renyi_graph(5, 0.3, seed=123, directed=True)
pos = nx.spring_layout(graph)
nx.draw_networkx(graph, pos=pos)
ax = plt.gca()
for node_id, color in zip([1, 4], ['crimson', 'limegreen']):
    ax.add_patch(plt.Circle(pos[node_id], 0.15, facecolor=to_rgba(color, alpha=0.2), edgecolor=color))
ax.set_aspect('equal', 'datalim')  # equal aspect ratio is needed to show circles undistorted
plt.show()

networkx graph drawing with added circles

  • Related