networkx 标签_networkx实现简单网络结构图

大家好,又拖更了。最近实习在做宏观和基本面量化,不得不说,作为一名合格的Quant,不光要具备高水平的代码能力,数学能力,还要有扎实的经济学和金融学基础。不然到最后没有充实的理论基础,做出再漂亮的结果可信度也不高。

本期内容来源于一个朋友的需求。需要用Python绘制一个网络图。

Python中绘制网格图一般使用networkx这个库,我们可以用pip来安装

pip install networkx

当然,如果你用的是Anaconda的话,自带这个库,就不用装了。

本文的开发环境是Jupyter Qtconsole,Python版本为3.8

首先,我们导入networkx库和要用到的库

import networkx as nximport pandas as pdimport matplotlib.pyplot as plt

读入需要绘制的数据

data = pd.read_csv('.../Rdata.csv')

看一下数据的格式

data.head(10)

195ddadd8de07abf58899c5bae4bc799.png

数据给了起始节点和终点节点,并且给出了每一个边的权重值。

用networkx绘制图形其实非常简单,有一点类似于matplotlib的搭积木的感觉,先定义一个画布,然后再逐渐的往上添加图层。

首先我们生成一个“画布”

G = nx.DiGraph()

由于我们的数据是一个包含起点和终点的数据集,因此我们生成了一个有向网格图。此时还是一个白板。我们需要往里添加点和边。

添加点的方法有这么几种。

041015470652d3673ee1b3a61adad64b.png

文档中说明,如果添加一个节点,需要能被hash加密的Python对象,除了None对象。

add_node方法可以这么使用

比如

G.add_node(1)G.add_node_from(['1', '2']) # 此处传入一个列表进行多个node的设定

添加完点之后,我们可以添加边

边的添加要使用到add_edge方法

与add_node方法类似,也可以单个添加或者多个添加

G.add_edge('x', 'y')G.add_edges_from([['a', 'b'], ['c', 'd']])

注意使用add_edges_from时要传入一个二维的列表

我们还可以添加带有权重的边,此时权重体现在边的厚度或者宽度上

方法为add_weighted_edges_from

此时,我们不论是添加单个边,还是多个边,都需要将起点节点,终点节点,和权重放在一个元组中,然后将单个元组或者多个元组放在一个列表中。

如下所示

G.add_weighted_edges_from([('x', 'y', 1.0)])G.add_weighted_edges_from([('a', 'b', 0.5), ('c', 'd', 0.8)])

我们可以一个一个的添加带有权重的边,也可以将他们放在一起统一添加。

那么我们此时可以写一个for循环来将我们的数据绘制到图中

for i in range(data.shape[0]):    x = str(data.iloc[i, :].loc['source'])    y = str(data.iloc[i, :].loc['target'])    w = float(data.iloc[i, :].loc['weight'])    G.add_weighted_edges_from([(x, y, weight)])

此时我们的就把数据全部绘制在图中了。

最后一步,我们需要将图显示出来。此时要用到networkx的draw方法,非常的直观。

将之前的画布对象传入即可

nx.draw(G)

cad67493b8d44cf995d2001de88c84b4.png

生成这样一个图。

但是呢,我们希望能够画的更加美观一点,起码把颜色改一下,把label显示出来。

我们可以使用下面的代码

nx.draw(G, pos=nx.random_layout(G), node_color='r',with_labels=True)

其中,pos表示位置,由于这时候我们的node并没有给出坐标,因此nx.random_layout会自动设定一个合理的位置。node_color表示节点的颜色,此处设为了红色,with_labels表示显示节点的标签。

我们输出图片看一看

5bcc278221233c58708f4a17347154d3.png

此时就比刚才的看起来舒服一些了。

如果大家想要做出更好更精美的图,可以参照这个网站

http://networkx.github.io/

如需本文的数据和代码,可以公众号后台进行索取。

这篇文章这么水,我也不好意思求大家点“在看了”...

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值