Networkx 绘制图形并在字典中显示节点属性

Networkx draw graph and show node attributes in a dict

我有一个图表,其中每个节点都有两个属性 'Name' 和 'Type'
我想在它能够在同一图中打印属性和节点名称的方式。目前,我能够在一个单独的绘图中打印它们,但文本会重叠。
我目前使用的代码是这样的:

# drawing the graph with the nodes labelled
fig, ax = plt.subplots(nrows=3, figsize=(10,10))
pos = nx.spring_layout(graph, k=5)
# drawing the graph only
nx.draw(graph, pos, ax[0], with_labels=True, edge_color=edge_color)

# getting node labels
names = nx.get_node_attributes(graph, 'Name')
nx.draw(graph, pos, ax=ax[1])
nx.draw_networkx_labels(graph, pos, labels=names, ax=ax[1])

types = nx.get_node_attributes(graph, 'Type')
nx.draw_networkx_labels(graph, pos, labels=types, ax=ax[1])
plt.show()

现在我正在为属性和节点标签绘制单独的图表。我当前的代码与标签和属性重叠,如下图所示:

第一个图包含节点标签,第二个图显示名称和类型属性,但它们重叠。
如何设置属性文本的格式以使它们不重叠?

防止文本项相互重叠的最简单方法是将它们合并为一个格式正确的文本对象。

labels = dict()
for node in graph.nodes:
    labels[node] = f"{names[node]}\n{types[node]}"
nx.draw_networkx_labels(graph, pos, labels=labels, ax=ax[1])

这会将名称和类型条目连接成一个字符串,并用换行符分隔。

正确处理节点和标签之间的重叠更难,因为 networkx 没有绘图元素之间的碰撞检测。我在 netgraph, a network visualisation library I wrote some time ago, in .

中概述了如何实现这一点