《权力的游戏》不仅因其紧张刺激的情节而受到全球观众的喜爱,其复杂的人物关系网同样是吸引观众的重要因素。本文旨在介绍如何利用 NetworkX 访问开源分布式图数据库 Nebula Graph,并通过 Gephi 进行可视化,从而对《权力的游戏》中的人物关系进行深入分析。
数据源
本文使用的数据来源于《冰与火之歌》系列小说的第一至第五卷。
- 人物节点集:每个小说中出现的角色被建模为一个节点,每个节点的主要属性为角色名称。
- 关系边集:如果两个角色在小说中有直接或间接的互动,则这两个角色之间会形成一条边。边的唯一属性是权重,表示两者之间互动的强度。
这些节点和边共同构成了一个图网络,存储于图数据库 Nebula Graph 中。
社区检测——Girvan-Newman 算法
为了更好地理解角色之间的关系,我们采用 NetworkX 中实现的 Girvan-Newman 社区检测算法来划分网络中的社区。
【Girvan-Newman 算法解析】:此算法通过计算网络中每条边的中间性中心度,并按降序移除这些边,直至网络分裂成多个独立的社区。具体步骤包括:计算所有边的中间性中心度;移除中间性中心度最高的边;重复上述过程,直至每个节点成为独立的社区。
接下来,我们将通过 Python 代码示例来实现这一过程:
comp = networkx.algorithms.community.girvan_newman(G)
k = 7
limited = itertools.takewhile(lambda c: len(c) <= k, comp)
communities = list(limited)[-1]
此外,还需为每个节点添加一个 'community' 属性,标识其所属的社区编号。
community_dict = {}
community_num = 0
for community in communities:
for character in community:
community_dict[character] = community_num
community_num += 1
nx.set_node_attributes(G, community_dict, 'community')
节点样式调整——Betweenness Centrality 算法
为了使可视化结果更加直观,我们根据节点的 Betweenness Centrality 值来调整节点的大小以及标签文字的大小。
【Betweenness Centrality 解释】:节点的中心性用于评估节点在网络中的重要性,Betweenness Centrality 是通过计算通过该节点的最短路径数量来衡量节点的重要性。
计算每个节点的 Betweenness Centrality 值,并将其作为节点的属性保存:
betweenness_dict = nx.betweenness_centrality(G) # 计算 Betweenness Centrality
nx.set_node_attributes(G, betweenness_dict, 'betweenness')
边的宽度设定
边的宽度直接反映了边的权重,即两个角色之间互动的强度。
至此,每个节点具有 'name'、'community' 和 'betweenness' 三个属性,而每条边则具有 'weight' 属性。
使用 Gephi 进行高级可视化
尽管 NetworkX 提供了基本的绘图功能,但 Gephi 在交互性和视觉效果方面更为出色。我们将之前处理过的数据导出为 .gexf 文件,并导入 Gephi 进行进一步的美化。
nx.write_gexf(G, 'game.gexf')
在 Gephi 中,通过调整 Force Atlas 布局参数,如增加斥力强度,可以有效避免节点重叠,提升图形美观度。同时,通过为不同社区分配不同的颜色,以及根据节点的 Betweenness Centrality 调整节点大小,可以更加直观地展示角色之间的关系强度。
最终,导出高质量的图像文件,完成《权力的游戏》角色关系图的制作。
后续文章预告
本篇文章介绍了如何使用 NetworkX 和 Gephi 对《权力的游戏》角色关系进行分析和可视化。下一篇文章将继续探索如何利用 NetworkX 访问存储在 Nebula Graph 中的数据。
本文涉及的代码可以在GitHub 仓库中找到。
致谢:感谢所有支持我的读者,本文是在参考了相关工作的基础上完成的,详情请见参考资料。
参考资料
[1] Kaggle - Game of Thrones Dataset
[2] Nebula Graph 官方网站
[3] NetworkX 官方网站
[4] Gephi 官方网站
[5] GitHub - nx2gephi
[6] Graph of Thrones - Neo4j 社交网络分析
作者有话说:大家好,我是王杰,一名专注于图数据 Nebula Graph 的研发工程师。希望通过这篇文章能够帮助大家更好地理解和应用图数据分析技术。如果有任何建议或指正,欢迎随时交流。