用networkx做网络关系可视化

许多有趣的问题可以表示成某种形式的图模型 - 顶点(或节点)与连接这些顶点的边之间的关系。例如:网站的链接和链接结构可以用有向图来表示,其中顶点表示网页,有向边代表从一个页面到另一个页面的链接。另一个例子是朋友圈,其中顶点代表不同的人,边代表关系的类型。
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)
用networkx做网络关系可视化_第1张图片

2、社交网络/人物关系可视化

社交网络分析用Networkx来做非常合适,我们可以把两人之间的互动作为一条边,互动次数作为边的权重,形成如下结构

张三 李四  10
李四 王五  20
王五 赵六 19

然后修改一下调用方法,加入边的权重

G = nx.from_pandas_edgelist(routes_us, source = 'source', target = 'target', edge_attr = 'numbers', create_using = nx.DiGraph())

可以绘制出类似下面的图表


冰与火之歌人物关系

备注:想要生成这样酷炫的效果可以用Gephi工具来实现

你可能感兴趣的:(用networkx做网络关系可视化)