利用Python中的networkx画复杂网络图

老师给了任务要画几个复杂网络的图,无奈MATLAB作图实在太麻烦,于是花了一个周末研究怎么画图。下面简单介绍python的第三方库NetworkX

NetworkX

NetworkX是一个用于创建,操作和研究复杂网络的结构,动态和功能的Python包。使用NetworkX,我们可以使用标准和非标准数据格式加载和存储网络,生成多种类型的随机和经典网络,分析网络结构,构建网络模型,设计新的网络算法,绘制网络等等。

基础教程

创建一个图

以下代码用来创建空图:

import networkx as nx
G = nx.Graph()

在这里,Graph是点与边的集合,点的种类有许多,它可以是任何哈希对象:字符串、图像、XML对象、另一个Graph...

我们可以一次插入一个点:G.add_node(1)

也可以直接从list中插入一系列点:G.add_nodes_from()

同样,你也可以把图H当做一个点插入到G中:G.add_node(H)

一次插入一条边:G.add_edge(1, 2)

同插入点,可以从list中插入一系列边:G.add_edges_from([(1, 2), (1, 3)])

删除/清空

如果想删除图中某特定的点或边,这里有类似上分add的命令:

G.remove_node()
G.remove_nodes_from()
G.remove_edge()
G.remove_edges_from

清空图G中的所有点与边,这个命令相比大家都能猜到,没错,就是G.clear()


以上省略了许多内容,且只考虑了无向无权图,更具体的教程还请移步:NetworkX

下面介绍个人认为NetworkX中的重点!

图生成器和图操作

除了以点与边生成图之外,还有以下方式创造图:

1. 典型图的操作命令:
subgraph(G, nbunch)      - 由图G的分支nbunch生成子图
union(G1,G2)             - 将图G1,G2结合构成一个图
disjoint_union(G1,G2)    - 假设所有的节点都不相同构成图
cartesian_product(G1,G2) - 由笛卡尔积生成图
compose(G1,G2)           - 结合两个图中共有的点构成图
complement(G)            - 图的补
create_empty_copy(G)     - 返回相同图类的空副本
convert_to_undirected(G) - 返回G的无向图表示
convert_to_directed(G)   - 返回G的有向图表示
2. 典型小图的命令:

复杂网络领域有一些经典的网络图供大家当做示例研究。以下只是部分:

petersen = nx.petersen_graph()
tutte = nx.tutte_graph()
maze = nx.sedgewick_maze_graph()
tet = nx.tetrahedral_graph()
3.使用典型图的生成器命令:
K_5 = nx.complete_graph(5)
K_3_5 = nx.complete_bipartite_graph(3, 5)
barbell = nx.barbell_graph(10, 10)
lollipop = nx.lollipop_graph(10, 20)
4.使用随机图的生成器命令:
er = nx.erdos_renyi_graph(100, 0.15)
ws = nx.watts_strogatz_graph(30, 3, 0.1)
ba = nx.barabasi_albert_graph(100, 5)
red = nx.random_lobster(100, 0.9, 0.9)
5.使用通用图形格式(如edge表,邻接表,GML,GraphML,pickle,LEDA等)读取存储在文件中的图形:
nx.write_gml(red, "path.to.file")
mygraph = nx.read_gml("path.to.file")

更多关于图的格式与生成器函数的信息请移步:
Reading and writing graphs
Graph generators

图的分析

networkx提供了一些关于图论的函数来帮助你分析图的特征:

>>> G = nx.Graph()
>>> G.add_edges_from([(1, 2), (1, 3)])
>>> G.add_node("spam")       # 加入点“spam”
>>> list(nx.connected_components(G))
[set([1, 2, 3]), set(['spam'])]
>>> sorted(d for n, d in G.degree())
[0, 1, 1, 2]
>>> nx.clustering(G)
{1: 0, 2: 0, 3: 0, 'spam': 0}

一些具有较大输出的函数迭代(节点,值)二元组。 这些很容易存储在一个dict结构中:

>>> sp = dict(nx.all_pairs_shortest_path(G))
>>> sp[3]
{1: [3, 1], 2: [3, 1, 2], 3: [3]}

如何画复杂网络图

NetworkX主要不是一个图形绘制软件包,但它包含Matplotlib的基本绘图以及使用开源Graphviz软件包的界面。 这些是networkx.drawing模块的一部分。首先引入matplotlib:import matplotlib.pyplot as plt

最基础的一个函数是nx.draw(G, pos=None, ax=None, **kwds),其中pos即图中各点的位置信息,这里我们就要用到以下几个函数来以某种算法生成各店的坐标:

  • circular_layout(G[, scale, center, dim]):Position nodes on a circle.
  • random_layout(G[, center, dim]):Position nodes uniformly at random in the unit square.
  • rescale_layout(pos[, scale]):Return scaled position array to (-scale, scale) in all axes.
  • shell_layout(G[, nlist, scale, center, dim]):Position nodes in concentric circles.
  • spring_layout(G[, k, pos, fixed, …]):Position nodes using Fruchterman-Reingold force-directed algorithm.
  • spectral_layout(G[, weight, scale, center, dim]):Position nodes using the eigenvectors of the graph Laplacian.

当然,除了使用draw直接将整个图画出来,你也可以利用draw_networkx_nodes, draw_networkx_edges, draw_networkx_labels等有选择性的分别画出网络的点、边、标签等等。

当然,最后不要忘记:plt.show()

参考:https://networkx.github.io/

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

推荐阅读更多精彩内容