用Igraph创建关系网络&简单网络分析

---------------------------------------------目录--------------------------------------------

一.Igraph简介

二.Igraph网络图创建与优化

三.网络图信息价值挖掘

四.小结

---------------------------------------------正文--------------------------------------------

一.Igraph简介

问题1:Igraph是什么,可以用来干什么?

Igraph是一个python工具包,它可以用于创建,操作和研究复杂网络系统。

问题2:为什么用Igraph?
实际运用过程中,很可能会遇到非常庞大的关系数据,当网络规模急剧扩大时,情况会变得纷繁复杂,处理网络结构的代价和开销也会随之增大,Igraph很多功能使用C语言开发,运算效率很高,十分适合解决大型复杂网络问题。另外,Igraph实现了一些复杂网络算法,如网络流、图同构、匹配算法以及社团结构等,分析的时候更加方便高效。

问题3:如何安装和使用Igraph包呢?
可以直接执行命令pip install python-igraph安装。
或者下载igraph安装包后,先解压安装包;再cd到安装包所在目录,如:cd C:\Users\user\Desktop\igraph;最后执行python setup.py install就可以啦。
安装完毕后,运行代码:import igraph,如果没报错,代表已经成功安装。

二.Igraph网络图创建与优化
以中国古代战国七雄为对象(点),不同国家若地理位置相邻,则认为存在地理联系(边),以此为基准,试着创建一个简单的抽象网络图(这里只探究两两相邻关系,不保证地理方位的正确性):

# 创建一个空对象
g = igraph.Graph()
# 添加网络中的点
vertex = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
g.add_vertices(vertex)
# 添加网络中的边
edges = [('a', 'c'), ('a', 'e'), ('a', 'b'), ('b', 'd'), ('b', 'g'), ('c', 'e'),
         ('d', 'f'), ('d', 'g'), ('e', 'f'), ('e', 'g'), ('f', 'g')]
g.add_edges(edges)
# -----------------------其它信息-----------------------------
# 国家名称
g.vs['label'] = ['齐', '楚', '燕', '韩', '赵', '魏', '秦']
# 国家大致相对面积(为方便显示没有采用真实面积)
g.vs['aera'] = [50, 100, 70, 40, 60, 40, 80]
# 统计日期
g['Date'] = '公元前279年'
# -----------------------简单作图-----------------------------
# 选择图的布局方式
layout = g.layout('kk')
# 用Igraph内置函数绘图
igraph.plot(g, layout)
战国势力地理关系图1.0

这张图不是很美观,那么如何去优化和完善它呢?比如说点的颜色、大小,边的长短、粗细等。可以通过调节igraph.plot()中的参数达到我们想要的效果:

# -----------------------设置参数-----------------------------
# 参数集合。visual_style是一个参数字典,可以动态添加想要个性化设定的参数
visual_style = {}
# 根据相对面积,设置点的大小
visual_style["vertex_size"] = g.vs['aera']
# 根据国家实力,设置点的颜色
visual_style["vertex_color"] = [color_map[power] for power in g.vs["power"]]
# 边的粗细(这里随机生成)
visual_style['edge_width'] = [2 + 5*np.random.rand() for i in np.arange(11)]
# 图尺寸
visual_style["bbox"] = (600, 480)
# 边缘距离
visual_style["margin"] = 50
# 布局方式
visual_style["layout"] = layout
# -----------------------画图-----------------------------
igraph.plot(g, **visual_style)
战国势力地理关系图1.1

PS:看懂以上代码,就了解了Igraph中基本的网络图的构建方法,以及可视化展示的常用参数设置方法。接下来,重点讲讲如何从这些网络图中找出一些有价值的信息。

三.网络图信息价值挖掘
那么,基于这张图,有哪些有价值的信息可以挖掘呢?
1.节点的度(degree)。
概念:某节点的度,只与该节点有直接联系的其它点的个数。在有向图中,度还可分为出度(out-defree)和进度(in-degree),它一定程度上表现了某节点周围的密集程度。
在本例中,度的实际含义是一个国家的邻国数量。

# 点的度
numbers = g.degree()
# 不同国家邻国数量
neighbors = dict(zip(g.vs['label'], numbers))
print(neighbors)

输出结果:

{'魏': 3, '燕': 2, '赵': 4, '楚': 3, '齐': 3, '韩': 3, '秦': 4}

2.中介中心性(betweenness)。
概念:一个结点担任其它两个结点之间最短路路劲的桥梁的次数,次数越多,该数越大。
在本例中指的是国家起到的枢纽作用大小。

# 计算中介中心性
betweenness = g.betweenness()
# 保留一位小数
betweenness = [round(i, 1) for i in betweenness]
# 与国家名对应
country_betweenness = dict(zip(g.vs['label'], betweenness))
print('不同国家的中介中心性(枢纽作用):\n', country_betweenness)

输出结果:

不同国家的中介中心性(枢纽作用):
 {'魏': 0.8, '燕': 0.0, '赵': 4.2, '楚': 1.8, '齐': 1.8, '韩': 0.5, '秦': 1.8}
中介中心性

3.另一个非常常见的操作是找两个点之间的最短路径。
概念:任选两个节点,连通这两个节点的最少边数,定义为这两个节点的最短路径长度。
当然,这里所指的最短路径,只用来表示不同国家间的抽象地理关系,和实际中的最短路径含义并不一致。

# 计算魏国和齐国的最短路径(如有多条路径,只取其中之一)
path = g.get_shortest_paths('c', 'd')[0]
seq = g.vs.select(path)
print('燕韩之间的最短路径: ', seq['label'])

输出文字结果:

燕韩之间的最短路径:  ['燕', '齐', '楚', '韩']

将最短路径用红色标记:

# --------------------------路径-----------------------------
path = seq['name']
# ---------------------给边设定颜色---------------------------
# 默认为黑色
edge_color = dict(zip(edges, ['black']*11))
# 最短路径里的边映射为红色。映射时需要考虑元组中对象顺序,这里按字母从小到大排序
for i in np.arange(np.size(path)-1):
    if path[i] < path[i+1]:
        edge_color[(path[i], path[i + 1])] = 'red'
    else:
        edge_color[(path[i + 1], path[i])] = 'red'
visual_style['edge_color'] = [edge_color[edge] for edge in edges]
# ------------------------画图------------------------------
m = igraph.plot(g, **visual_style)
燕韩最短路径标识

四.小结
理解网络图的角度很多,往往是对图网络进行某种程度的抽象统计或聚焦观察。以上只是举了一个通俗易懂的小例子,实现了网络图的创建和展示,并提供了几种分析图信息的方法,可以作为初步理解网络结构的工具。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,780评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,424评论 1 305
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,397评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,576评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,997评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,945评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,107评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,850评论 0 208
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,625评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,804评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,285评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,613评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,291评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,164评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,963评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,096评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,886评论 2 278

推荐阅读更多精彩内容

  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,757评论 0 5
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 2,864评论 1 3
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    aimaile阅读 26,306评论 6 428
  • 英文原版:https://github.com/vinta/awesome-python中文版:https://g...
    会灰的大飞狼阅读 3,564评论 1 56
  • 其实,这本书的封面设计给我的感觉就很不好。流线型的金属外壳,用铆钉连接,一块接一块,白色细斜体的书名“孤独深处”。...
    单海阅读 933评论 0 1