如何根据节点颜色向networkx图添加图例

Bro*_*oke 5 python matplotlib networkx pandas

我是第一次使用 NetworkX,并且正在基于 pandas 数据框绘制一个简单的网络。

节点位于 Nodes_df 中,其中包含 ID 和相应的 Group,其中 Group 决定节点的颜色。Edges_df 的边是 ID 和 ID_2 之间的联系。所有 id 都在 Nodes_df 中。

我可以绘制图表,并根据字典为节点着色,该字典将字符串(即“Group1”)替换为参数使用的数字cmap

Colour_df = Edges_df.replace({"Group5": 5,"Group4": 4, "Group3": 3, "Group2": 2, "Group1": 1})

Colour_map = dict(zip(Nodes_df["ID"].astype(float), Colour_df["Group"]))

G = nx.from_pandas_edgelist(df=Edges_df, source="ID", target="ID_2",
                            create_using=nx.Graph())

values = [Colour_map.get(node) for node in G.nodes()]

nx.draw(G, cmap=plt.get_cmap('Spectral'), node_color=values,
        node_size=20)

plt.show()
Run Code Online (Sandbox Code Playgroud)

我正在使用 matplotlib,但无法在图表上显示图例。我尝试将字典传递给labelin 的参数nx.draw_networkx_nodes(),但我只得到 KeyError: 5。

我只想要一个看起来像这样的图例:

[ ] 组1

[ ] 组2

[ ] 第3组

[...]

war*_*ped 5

您可以创建一个与同一图中的图形具有相同配色方案的空散点图,并使用其图例:

虚拟图表数据

Nodes_df = pd.DataFrame(
    {'ID': range(20),
     'Group': ['Group{}'.format(np.random.randint(1,6)) for a in range(20)]}
)

Edges_df = pd.DataFrame(
    {'ID': np.random.randint(0,20,20),
     'ID_2': np.random.randint(0,20,20)}
)

Edges_df = Edges_df.merge(Nodes_df, how='left', left_on='ID', right_on='ID')
Run Code Online (Sandbox Code Playgroud)

颜色

# your code
Run Code Online (Sandbox Code Playgroud)
Colour_df = Edges_df.replace({"Group5": 5,"Group4": 4, "Group3": 3, "Group2": 2, "Group1": 1})
Colour_map = dict(zip(Nodes_df["ID"].astype(float), Colour_df["Group"]))
G = nx.from_pandas_edgelist(df=Edges_df, source="ID", target="ID_2",
                            create_using=nx.Graph())
values = [Colour_map.get(node) for node in G.nodes()]
Run Code Online (Sandbox Code Playgroud)

绘画

# compute maximum value s.t. all colors can be normalised
maxval = np.max(values) 

# get colormap
cmap=plt.cm.Spectral

# draw graph
nx.draw(G,
        node_color = [cmap(v/maxval) for v in values], # feed normalised group numbers directly into colormap
        node_size=50)

# make empty plot with correct color and label for each group
for v in set(values):
    plt.scatter([],[], c=[cmap(v/maxval)], label='Group{}'.format(v))

plt.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述