作为计算社会科学的重要方法,社会网络分析是近年来国内逐渐普及的人文社科新方法。
社会网络又叫复杂网络,社会网络用节点与边表示一组事物之间关系的方式,这种思想来源于数学中的图论。对广大文科生来说,虽然不需要理解图论的全部知识,但需要了解社会网络相关的基本概念,数据猿就以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, iteratinotallow=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
、接近中性度
、最短网络直径
等。并且,还需充分理解社会网络分析的布局等可视化方法,这样才能从容地解决大量的社会网络分析问题。
参考资料:
networkx官方文档:
https://networkx.github.io/documentation/
文字编辑:数据猿Riggle