【问题标题】:How can I add a legend of node labels, stored in a dictionary, to a networkx plot?如何将存储在字典中的节点标签图例添加到 networkx 图中?
【发布时间】:2019-09-22 21:42:54
【问题描述】:

我正在使用 networkx 绘制一个简单的社交网络,并有一个节点标签字典,其中字典值是个人姓名。我知道如何用名称标记我的网络中的节点,但最终名称会很长并且网络会很大,因此各种传说将是合适的。图例将由行组成,每行的形式为节点编号,后跟个人姓名。

这是一个简单的例子:

import networkx as nx
import numpy as np

A = np.matrix([[0,1,1,0,0],[1,0,1,0,0],[1,1,0,1,1],[0,0,1,0,1],[0,0,1,1,0]])
labels_dict={0: 'Donald', 1: 'Pete', 2: 'Kamala', 3: 'Elizabeth', 4: 'Bernie'}

G = nx.from_numpy_matrix(A)
pos = nx.spring_layout(G)

nx.draw_networkx(G, pos, node_color='lightgray')
ax=plt
ax.axis('off')
fig = ax.gcf()
plt.show()

当然,这将简单地标记节点 1、2、3、4、5。

我希望图例出现在我的绘图右侧,看起来像下面这样:

  1. 唐纳德
  2. 皮特
  3. 卡玛拉
  4. 伊丽莎白
  5. 伯尼

【问题讨论】:

  • networkx 中没有执行此操作的功能。然而,networkx 只是调用 matplotlib 来制作它的图,所以你的问题真的归结为“我如何在 matplotlib 中使用以下项目创建自定义图例”。有一个指南可以帮助您入门here
  • 谢谢。我现在可以看到我需要做什么了。

标签: python matplotlib networkx


【解决方案1】:

我会建议以下,使用你上面的代码。

import networkx as nx
import numpy as np
import matplotlib.patches as patches
import matplotlib.pyplot as plt
from secrets import token_hex

A = np.matrix([[0, 1, 1, 0, 0], [1, 0, 1, 0, 0], [ 1, 1, 0, 1, 1], [0, 0, 1, 0, 1], [0, 0, 1, 1, 0]])
labels_dict = {0: 'Donald', 1: 'Pete', 2: 'Kamala', 3: 'Elizabeth', 4: 'Bernie'}
G = nx.from_numpy_matrix(A)

# plotting with the same colors for all node labels
handles_dict = {patches.Patch(color='white', label=f"{k}, {v}") for k,v in labels_dict.items()}
pos = nx.spring_layout(G)
nx.draw_networkx(G, pos, node_color='lightgray')
plt.legend(handles=handles_dict)
plt.show()

上面的代码会得到下面的情节

.

但是,如果您希望它采用不同的颜色,您可以这样做:

pos = nx.spring_layout(G)
# token_hex() generates random hex color/numbers
handles___ = {k: f"#{token_hex(4)}" for k in labels_dict.keys()}
handles___ = dict(sorted(handles___.items()))
handles_dict = {patches.Patch(color=k, label=v) for k, v in zip(handles___.values(), labels_dict.values())}
node_color = list(handles___.values())
nx.draw_networkx(G, pos, node_color=node_color)
plt.legend(handles=handles_dict)
plt.show()

这段代码将输出:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多