上一篇文章直接给大家发了个封装好的复杂网络分析脚本,bug比较多。也不方便自己DIY,今天咱么就条分缕析,一点点拆解。然后大家根据需要,自己DIY吧。
关系图之原始数据
我给大家编了下面两组原始数据,试图画出abcd四元素之间的关系
nodes_data = ['a', 'b', 'c', 'd']
raw_data = ['acW', 'aca', 'caE', 'ec', 'cd', 'dc']
我们做关系网络前的最初始数据最好就是上面这样子,这种数据格式还是比较简单的。
nodes_data表示节点数据,用来在图中画节点
raw_data中含有共现的相互关系,但是需要进一步的清理规整。
关系图之数据格式
{source: {target: weight}}
source起点
target终点
weight权重(起点到终点次数)
nodes_data = ['a', 'b', 'c', 'd']
raw_data = ['acW', 'aca', 'caE', 'ec', 'cd', 'dc']
nodes_data和raw_data整理成有权有向数据格式如下:
{'a': {'c': 4},
'c': {'a': 4, 'd': 2},
'd': {'c': 2}}
上面的格式即可用来画有权有向图,也可用到无权无向图,还可画有权无向图、无权有向图。
无权无向图 无权有向图 有权无向图 有权有向图所以数据保存,尽量保存为有权有权有向格式。尽可能保存多的信息,请用有权有向数据格式。
后面所有的关系图数据格式均以有权有向格式为基准。
如何实现有权有向数据格式
nodes_data = ['a', 'b', 'c', 'd']
raw_data = ['acW', 'aca', 'caE', 'ec', 'cd', 'dc']
||
||?
\/
{'a': {'c': 4},
'c': {'a': 4, 'd': 2},
'd': {'c': 2}}
这里很难,我估计我今天也说不太清除。这个只能希望大家悟性比我高,在就是运行下,编点简单的数据实验试验下,发现规律,也就懂了。
networkx需要的数据格式
有了上面富有信息量的有向有权格式数据还不行,我们要再将数据微调下,才能使用networkx库。
networkx需要啥数据格式?
data = {'a':{'b':1},
'c':{'a':2},
'e':{'b':3},
'b':{'a':4}}
nodes = {'a','b','c','d','e'}
networkx节点
#首先导入库,解决中文显示问题
单节点 双节点 多节点import networkx as nx
import matplotlib.pyplot as plt
from pylab import mpl
#解决显示中文问题
# 指定默认字体
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 解决保存图像是负号'-'显示为方块的问题mpl.rcParams['axes.unicode_minus'] = False
可见networkx创建节点需要的数据很简单,就是字符串或者列表(集合也可以的)。而且本身nodes数据就是列表,直接就能用到networkx构建节点中来。
但是networkx构建边时候,要用什么样式的呢?
networkx无向边
单边 双边 多边可见networkx无向边的构建只需要元组或列表数据,但是如何从有权有向格式数据转化为元组或者列表(集合也可以的)数据呢?
data = {'a':{'b':1},
'c':{'a':2},
'e':{'b':3},
'b':{'a':4}}
一、无权无向边
a->b 和b->a是一条边
data的边的集合是{('e', 'b'), ('c', 'a'), ('a', 'b')}
生成无权无向边数据的代码:
生成无权无向边数据二、 有权无向边
a->b和b->a使得 ab共出现5次。
有权无向边应为{('c', 'a', 2), ('a', 'b', 5), ('e', 'b', 3)}
生成有权无向边数据networkx有向边
可见networkx无向边的构建只需要元组或列表数据,但是如何从有权有向格式数据转化为元组或者列表(集合也可以的)数据呢?
data = {'a':{'b':1},
'c':{'a':2},
'e':{'b':3},
'b':{'a':4}}
一、无权有向边
a->b 和b->a是一条边
data的边的集合是{('a', 'b'), ('b', 'a'), ('c', 'a'), ('e', 'b')}
生成无权有向向边数据的代码:
生成无权有向向边数据二、有权有向边
[('a', 'b', 1), ('c', 'a', 2), ('e', 'b', 3), ('b', 'a', 4)]
生成有权有向边数据这样更好理解些
weight = data.get(node_k).get(node_v)
其实涉及到有权的边画图,比如让边显示粗细以表示权重大小。这个我还没有实现,主要是刚刚学networkx。不过今天这篇文章的探讨还是很有用的。可以将数据整理成其他绘图软件指定格式。绘制有权图。
写了这么多也不知道大家搞糊涂了没有,反正我写的有点晕!
公众号原文
附有文中所有代码的下载资源
更多内容
文本分析
神奇的python
爬虫
【视频】有了selenium,小白也可以自豪的说:“去TMD的抓包、cookie”
网友评论