NetworkX,一个神奇的可视化库!

文摘   2024-08-24 11:42   浙江  

大家好,我是小伍哥,周末了,给大家分享个networkx可视化的案例,这个案例是官方的一个案例,有很多东西可以参考学习的。

任    务:分析1886-1985年的国际象棋对局数据,绘制多路有向图,节点尺寸为胜利个数,连接宽度为对局个数。

官方链接:https://networkx.org/documentation/stable/auto_examples/drawing/plot_chess_masters.html#sphx-glr-download-auto-examples-drawing-plot-chess-masters-py

数据格式:


1、数据读取和构图
首先来读取数据和简单的可视化。后台回复【下棋】获取数据集。

import pandas as pdimport networkx as nximport matplotlib.pyplot as pltdf = pd.read_csv('chess_masters_WCC.csv')df.columns'''Index(['Event', 'Site', 'Date', 'EventDate', 'ECO', 'Round', 'White', 'Black',       'Result', 'Moves'],      dtype='object')'''
# 从连接表创建MultiDiGraph多路有向图G = nx.from_pandas_edgelist(df, 'White', 'Black', edge_attr=True, create_using=nx.MultiDiGraph())print('棋手(节点)个数', G.number_of_nodes()) # 25print('棋局(连接)个数', G.number_of_edges()) # 685pos = nx.spring_layout(G, seed=10)nx.draw(G, pos) # 初步可视化
# 连通域分析: 将G转为无向图,分析连通域H = G.to_undirected()for each in nx.connected_components(H): print('连通域') print(H.subgraph(each)) print('包含节点') print(each)    print('\n')

2、边和节点大小设置

根据我们任务规定边和节点可视化属性规则,如任意两个棋手之间的边长,和棋局数成正比;棋手节点大小和赢棋次数成正比。

# 将G转为无向-单连接图H = nx.Graph(G)
# 两个棋手节点之间的 连接宽度 与 棋局个数 成正比edgewidth = [len(G.get_edge_data(u, v)) for u, v in H.edges()]
# 棋手节点的大小 与 赢棋次数 成正比wins = dict.fromkeys(G.nodes(), 0) # 生成每个棋手作为key的dict
for (u, v, d) in G.edges(data=True): r = d["Result"].split("-") if r[0] == "1": wins[u] += 1.0 elif r[0] == "1/2": wins[u] += 0.5 wins[v] += 0.5 else: wins[v] += 1.0nodesize = [wins[v] * 50 for v in H]


3、数据可视化

开始我们的可视化,布局用kamada_kawai_layout,这布局其实就是个坐标列表,如果对于布局不满意,可以手动调整,把一些遮挡的节点挪一挪。节点和边,可以分开可视化的,然后叠起来。其实这个networkx可视化,有非常多的内容可以讲,后面出一个系列。

# 布局pos = nx.kamada_kawai_layout(H)
# 手动微调节点的横坐标(越大越靠右)、纵坐标(越大越靠下)pos["Reshevsky, Samuel H"] += (0.05, -0.10)pos["Botvinnik, Mikhail M"] += (0.03, -0.06)pos["Smyslov, Vassily V"] += (0.05, -0.03)
fig, ax = plt.subplots(figsize=(12, 12),dpi=800)
# 可视化连接nx.draw_networkx_edges(H, pos, alpha=0.3, width=edgewidth, edge_color="m")
# 可视化节点nx.draw_networkx_nodes(H, pos, node_size=nodesize, node_color="#210070", alpha=0.9)
# 节点名称文字说明label_options = {"ec": "k", "fc": "white", "alpha": 0.7}nx.draw_networkx_labels(H, pos, font_size=14, bbox=label_options)
# 标题和图例font = {"fontname": "Helvetica", "color": "k", "fontweight": "bold", "fontsize": 16}ax.set_title("World Chess Championship Games: 1886 - 1985", font)# 图例字体颜色font["color"] = "r"
# 文字说明ax.text( 0.80, 0.10, "edge width = # games played", horizontalalignment="center", transform=ax.transAxes, fontdict=font,)ax.text( 0.80, 0.06, "node size = # games won", horizontalalignment="center", transform=ax.transAxes, fontdict=font,)
# 调整图的大小,提高可读性ax.margins(0.1, 0.05)fig.tight_layout()plt.axis("off")plt.show()

edge_color="skyblue"

edge_color="#008B8B"

往期精彩:

复杂网络社群检测-Leiden算法实战

金融风控-通用建模流程

业务实战-如何搭建知识图谱?

作为风控人,你会找工作么?

利用决策树分分钟生成上千条策略-代码更新

万物皆网络,万字长文详解社区发现算法Louvain

策略自动化挖掘、团伙挖掘-课程链接

社区发现之标签传播算法(LPA)

风控中的复杂网络-学习路径图

长按关注本号             长按加我进群
      

小伍哥聊风控
风控策略&算法,内容风控、复杂网络挖掘、图神经网络、异常检测、策略自动化、黑产挖掘、反欺诈、反作弊等
 最新文章