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

4f7cacf1f0400f52d5d74790f1c6304d.jpeg

周末了,给大家分享个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

数据格式:

ec407315d36c53330cc9d5f00f661eef.png

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

import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
df = 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()) # 25
print('棋局(连接)个数', G.number_of_edges()) # 685
pos = 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.0
nodesize = [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()

54b3c3c24695d249a249759421b71dc2.png

edge_color="skyblue"

f36f1ac3c3b05dfd538df5566ccc5f3a.png

edge_color="#008B8B"

e69a108f192b88123c5113af0a9077b0.png

 
 

d787b130b4d9f8bee7912863601d0672.jpeg

 
 
 
 
 
 
 
 
 
 
 
 
往期精彩回顾




适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑
  • 交流群

欢迎加入机器学习爱好者微信群一起和同行交流,目前有机器学习交流群、博士群、博士申报交流、CV、NLP等微信群,请扫描下面的微信号加群,备注:”昵称-学校/公司-研究方向“,例如:”张小明-浙大-CV“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~(也可以加入机器学习交流qq群772479961)

0da6c72ead85a8ad523a47381c1292e1.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值