作为计算社会科学的重要方法,社会网络分析是近年来国内逐渐普及的人文社科新方法。
社会网络又叫复杂网络,社会网络用节点与边表示一组事物之间关系的方式,这种思想来源于数学中的图论。对广大文科生来说,虽然不需要理解图论的全部知识,但需要了解社会网络相关的基本概念,数据猿就以Networkx和Gephi为例,展开对社会网络分析的探索。
希望能通过对python的networkx的学习和使用,逐渐熟悉社会网络分析在人文社科中的应用。今天先从Networkx开始,学习networkx生成图的基本方法。
本文目录如下——
Networkx,可以用于创建、操控和研究复杂网络的结构、动力和功能的Python第三方库。
networkx功能和优势
Networkx脱胎于图论,是一款针对复杂网络的软件,其功能和优势如下——
可描述简单图、有向图和多图数据结构
多种标准图算法
网络结构和分析方法
生成经典图,随机图和语义网络
任意数据形式可构成节点,任意数据属性可形成边
3种 BSD 附属开源协议
已测试良好的代码覆盖90%
其他python的优势,如快速成型、易于教授和多平台适应
networkx的安装
需要 Python 3.6, 3.7, 3.8版本。
pip安装pip install networkx升级pip install --upgrade networkx卸载pip uninstall networkx
安装networx,同时需要安装过以下软件
NumPy 提供矩阵和线性代数的相关数学算法支持
SciPy
pandas 提供稀疏矩阵表示图和许多数值科学工具
Matplotlib 提供灵活的绘图工具
PyGraphviz and pydot 提供绘图和布局
PyYAML 提供YAML格式的读写
gdal 提供shapefile格式的读写
lxml 适用于 GraphML XML 格式的读写
networkx简单绘图.Graph()
导入库
import networkx as nximport matplotlib.pyplot as plt
创建简单的图——无向单图
#创建最简单的图G = nx.Graph() # 注意,Graph,而不是graph# 添加点G.add_node(1)# 添加边G.add_edge(2,3)#元组# 绘图nx.draw(G)
可以看到,3个节点被创建,节点2,3之间有一条边。这就是networkx中最简单的图,无向单图。
networkx有向单图.DiGraph()
在Digraph
中,除了add_node()
方法添加元组类型的边,还可以通过add_nodes_from()
添加列表类型的边。在旧版本的networkkx还可以使用add_cycle()
,利用列表创建一个闭环的图。number_of_edges()
可以计算边的数量和。
G = nx.DiGraph()G.add_node(1)G.add_node(2)G.add_nodes_from([3, 4, 5, 6])#G.add_cycle([1, 2, 3, 4])G.add_edge(1, 3)G.add_edges_from([(3, 5), (3, 6), (6, 7)])print("输出全部节点:{}".format(G.nodes()))print("输出全部边:{}".format(G.edges()))print("输出全部边的数量:{}".format(G.number_of_edges()))nx.draw(G)plt.show()
添加字符串为节点
G.add_node("wenkeshuju") # adds node "wenkeshuju"G.add_nodes_from("wenkeshuju") # adds 10 nodesG.add_edge(3, 'w')
路径图.path_Graph()
.path_Graph()
可以添加节点的任何可迭代容器。如果容器产生2元组(node
, node属性dict
),则还可以添加节点和节点属性。
路径图.path_Graph()G = nx.path_graph(8)nx.draw(G)plt.show()
循环图.cycle_graph()
.cycle_graph()
可以形成一个完善的首尾相接循环图,是基本的复杂网络结构之一。
G = nx.cycle_graph(24)pos = nx.spring_layout(G, iterations=200)nx.draw(G, pos, node_color=range(24), node_size=800, cmap=plt.cm.Blues)plt.show()
注意,这里的pos
参数,采用了spring_layout()
布局,iterations
是迭代次数,一般来说,迭代次数越多,节点的布局越合理。node_color
和node_size
调控节点颜色和大小,cmap
限定主题颜色。
皮特森图.petersen_graph()
皮特森图是一种特殊的图,它是一个有趣的连通简单图,一般画作五边形中包含有五角星的造型。Petersen图的构成多种多样,形态各异,共120多种,然而它不是平面图,因而没有一种使得边与边没有交点。
# 绘制皮特森图G = nx.petersen_graph()plt.subplot(121)nx.draw(G, with_labels=True, font_weight='bold')plt.subplot(122)nx.draw_shell(G, nlist=[range(5, 10), range(5)], with_labels=True, font_weight='bold')plt.show()
可以看到,Petersen图的顶点具有轮换对称性,即Petersen图是旋转对称的,Petersen图的边也随着点一起对称。
除以上经典的图形外,还需要了解的是无向多图和有向多图两种类型,以及非常多的基本图形。如下表所示——
小结
了解到networkx
生成图的方式和种类只是networkx
的第一步,对于文科生来说,我们还需要掌握如何将多种类型的数据转为社会网络和语义网络,并充分理解社会网络分析的各项分析指标,如pagerank
、接近中性度
、最短网络直径
等。并且,还需充分理解社会网络分析的布局等可视化方法,这样才能从容地解决大量的社会网络分析问题。
往期经典文章:
python办公自动化(一) | chardet库自动读写多编码格式的文件
python制作微信公众号聊天机器人
文科数据员公众号历史记录 | 2020年2月-5月
python清洗知网文献数据,生成共现矩阵
某校新传院的Python作业(一) | 三个女孩的奇幻之旅
参考资料:
networkx官方文档:
https://networkx.github.io/documentation/
文字编辑:数据猿Riggle
首发平台:公众号:文科数据员(HSS_data)