gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:59:35 25 4
gpt4 key购买 nike

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

节点在 Nodes_df 中,它有 ID 和对应的组,其中组决定了节点的颜色。 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()

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

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

[ ] 组 1

[ ] 组 2

[ ] 第三组

[...]

最佳答案

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

虚拟图数据

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')

颜色
# your code

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()]


画画
# 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()

enter image description here

关于python - 如何根据节点颜色向networkx图添加图例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60706947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com