使用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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐