使用networkx生成带有边标签和节点名称的网络图
使用networkx生成带有边标签和节点名称的网络图第一次画这种关系图,本来还想尝试自己画出来的,结果发现除效果图惨不忍睹,还是借用了python的nwtworkx画的网络关系图,也踩了很多坑,最终得到一个看起的结果,亲测可用,效果如下:代码如下,核心代码其实只有两行。node_labels = nx.get_node_attributes(G, 'desc')# 获取节点的desc属性nx.dr
使用networkx生成带有边标签和节点名称的网络图
第一次画这种关系图,本来还想尝试自己画出来的,结果发现出来的效果图惨不忍睹,还是借用了python的networkx画的网络关系图,也踩了很多坑,最终得到一个看起来还不错的结果,亲测可用,效果如下:
代码如下,核心代码其实只有两行。
node_labels = nx.get_node_attributes(G, 'desc') # 获取节点的desc属性
nx.draw_networkx_labels(G, pos, node_labels=node_labels,font_size=20) # 将desc属性,显示在节点上
edge_labels = nx.get_edge_attributes(G, 'name') # 获取边的name属性,
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels,font_size=20) # 将name属性,显示在边上
import networkx as nx
import matplotlib.pyplot as plt
import pandas as pd
import math
from collections import Counter
import networkx as nx
data = pd.read_excel('./data.xlsx', keep_default_na=False)
counter_list = Counter()
ori_list = {}
import numpy as np
import matplotlib.pyplot as plt
# print(len(set(data['source']+data['target'])))
set_list = []
for x, y in zip(data['source'], data['target']):
if x != '' and y != '':
set_list+=[x,y]
if (x, y) not in ori_list:
ori_list[(x, y)] = 1
else:
ori_list[(x, y)] += 1
ori_list = sorted(ori_list.items(), key=lambda x: x[1], reverse=True)
data_list = []
label_x = [-10+i*1 for i in range(0,49)]
for k in ori_list:
data_list.append(list(k[0]) + [k[1]])
set_list = list(set(set_list))
print(len(set_list))
add_nodes = []
we = []
def main():
G = nx.Graph()
# 添加添加节点
for word in data_list[:]:
for w in word[:2]:
if w not in add_nodes:
G.add_node(str(w), desc=str(w))
add_nodes.append(w)
# 添加边
for item in data_list[:]:
G.add_edge(str(item[0]), str(item[1]), name=str(item[2]))
we.append(item[2])
# topology construction logic
# draw graph with labels
plt.figure(3, figsize=(25, 25)) # 这里控制画布的大小,可以说改变整张图的布局
plt.subplot(111)
pos = nx.spring_layout(G, iterations=20)
# nx.draw(G1_LCC, node_color="red", edge_color="grey", node_size="20")
nx.draw(G, pos,edge_color="grey", node_size=500) # 画图,设置节点大小
node_labels = nx.get_node_attributes(G, 'desc') # 获取节点的desc属性
nx.draw_networkx_labels(G, pos, node_labels=node_labels,font_size=20) # 将desc属性,显示在节点上
edge_labels = nx.get_edge_attributes(G, 'name') # 获取边的name属性,
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels,font_size=20) # 将name属性,显示在边上
# 检测圆环
print(nx.cycle_basis(G.to_undirected()))
plt.savefig('./tu.pdf')
plt.show()
if __name__ == '__main__':
main()
网络关系图:
更新:
networkx更新到2.1版本后,nx.draw(G, pos,node_size=1000,node_color=‘red’,font_color=‘red’),节点之间的连线,就可以使用箭头了,效果见下:
参考信息,感谢大佬们的贡献
链接:
[1]: https://blog.csdn.net/qq_41854763/article/details/103405760?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control
[2]:https://www.cnpython.com/qa/228888
[3]: https://blog.csdn.net/csu150208/article/details/104812884
[4]: https://stackoom.com/question/3C6QU/%25E5%259C%25A8networkx%25E4%25B8%25AD%25E6%259B%25B4%25E6%2594%25B9%25E7%25AE%25AD%25E5%25A4%25B4%25E7%25B1%25BB%25E5%259E%258B
更多推荐
所有评论(0)