Python 如何基于节点颜色向networkx图形添加图例
我第一次使用NetworkX,我正在基于pandas数据帧绘制一个简单的网络 节点位于节点_df中,该节点具有ID和相应的组,其中组确定节点的颜色。边_df具有边,这些边是ID和ID_2之间的连接。所有ID都位于节点_df中 我可以绘制图形,并根据字典为节点着色,字典将字符串(即“Group1”)替换为Python 如何基于节点颜色向networkx图形添加图例,python,pandas,matplotlib,networkx,Python,Pandas,Matplotlib,Networkx,我第一次使用NetworkX,我正在基于pandas数据帧绘制一个简单的网络 节点位于节点_df中,该节点具有ID和相应的组,其中组确定节点的颜色。边_df具有边,这些边是ID和ID_2之间的连接。所有ID都位于节点_df中 我可以绘制图形,并根据字典为节点着色,字典将字符串(即“Group1”)替换为cmap参数使用的数字 Colour_df = Edges_df.replace({"Group5": 5,"Group4": 4, "Group3": 3, "Group2": 2, "Grou
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,无法在图表上显示图例。我已尝试将字典传递到nx.draw\u networkx\u nodes()
中的label
参数,但我只得到keyrerror:5
我只想要一个像这样的传奇:
[]第1组
[]第2组
[]第3组
[…]您可以在同一绘图中创建与图形具有相同颜色方案的空散点图,并使用其图例: 虚拟图数据
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')
颜色
绘图
# 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()
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()