许多有趣的问题可以表示成某种形式的图模型 - 顶点(或节点)与连接这些顶点的边之间的关系。例如:网站的链接和链接结构可以用有向图来表示,其中顶点表示网页,有向边代表从一个页面到另一个页面的链接。另一个例子是朋友圈,其中顶点代表不同的人,边代表关系的类型。
networkx是python下的复杂网络编程包,可以用来做图模型的可视化。
安装
pip install networkx
创建图
第一步:图的声明
networkx有四种图 Graph 、DiGraph、MultiGraph、MultiDiGraph,分别为无多重边无向图、无多重边有向图、有多重边无向图、有多重边有向图。
import networkx as nx
G = nx.Graph()
G = nx.DiGraph()
G = nx.MultiGraph()
G = nx.MultiDiGraph()
第二步:添加节点和边
# 方法一--------------------------------------
G.add_node('a') # 添加点a
G.add_node(1,1) # 用坐标来添加点
G.add_edge('x','y') # 添加边,起点为x,终点为y
G.add_weight_edges_from([('x','y',1.0)]) # 第三个输入量为权值
# 方法二--------------------------------------
list = [[('a','b',5.0),('b','c',3.0),('a','c',1.0)]
G.add_weight_edges_from([(list)])
# 方法三--------------------------------------
G = nx.from_pandas_edgelist(df_table, source = 'A', target = 'B', edge_attr = 'C', create_using = nx.DiGraph())
第三步:图的显示
import matplotlib
import matplotlib.pyplot as plt
nx.draw(G,
pos = nx.random_layout(G), # pos 指的是布局,主要有spring_layout,random_layout,circle_layout,shell_layout
node_color = 'b', # node_color指节点颜色,有rbykw,同理edge_color
edge_color = 'r',
with_labels = True, # with_labels指节点是否显示名字
font_size =18, # font_size表示字体大小,font_color表示字的颜色
node_size =20) # font_size表示字体大小,font_color表示字的颜色
plt.savefig("network.png")
nx.write_gexf(G, 'network.gexf') # gexf格式文件可以导入gephi中进行分析
plt.show()
应用
1、飞行网络可视化
数据不是很合适,仅用作示例
# -*- coding: utf-8 -*-
import networkx as nx
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import os
FILE_DIR = os.path.dirname(os.path.abspath(__file__))
# 设置matplotlib正常显示中文
plt.rcParams['font.sans-serif']=['SimHei'] # 用黑体显示中文
plt.rcParams['axes.unicode_minus']=False
def load_data(filename):
'''
读取文件
'''
file = os.path.splitext(filename)
preffix, postfix = file
postfix = postfix.lower()
if postfix == '.csv':
data = pd.read_csv(os.path.join(FILE_DIR, filename))
elif postfix == '.txt':
data = pd.read_table(os.path.join(FILE_DIR, filename))
elif postfix == '.xls' or postfix == '.xlsx':
data = pd.read_excel(os.path.join(FILE_DIR, filename))
elif postfix == '.pkl':
data = pd.read_pickle(os.path.join(FILE_DIR, filename))
return data
def plot_network(pd_table):
'''
绘制网络关系图
'''
G = nx.from_pandas_edgelist(pd_table, source = 'name', target = 'province', create_using = nx.DiGraph())
nx.draw(G,
pos = nx.circular_layout(G),
node_color = 'b',
edge_color = 'r',
with_labels = True,
font_size =10,
node_size =20)
plt.show()
box = load_data('air.xls')
plot_network(box)
2、社交网络/人物关系可视化
社交网络分析用Networkx来做非常合适,我们可以把两人之间的互动作为一条边,互动次数作为边的权重,形成如下结构
张三 李四 10
李四 王五 20
王五 赵六 19
然后修改一下调用方法,加入边的权重
G = nx.from_pandas_edgelist(routes_us, source = 'source', target = 'target', edge_attr = 'numbers', create_using = nx.DiGraph())
可以绘制出类似下面的图表
备注:想要生成这样酷炫的效果可以用Gephi工具来实现