大家好,又拖更了。最近实习在做宏观和基本面量化,不得不说,作为一名合格的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)
数据给了起始节点和终点节点,并且给出了每一个边的权重值。
用networkx绘制图形其实非常简单,有一点类似于matplotlib的搭积木的感觉,先定义一个画布,然后再逐渐的往上添加图层。
首先我们生成一个“画布”
G = nx.DiGraph()
由于我们的数据是一个包含起点和终点的数据集,因此我们生成了一个有向网格图。此时还是一个白板。我们需要往里添加点和边。
添加点的方法有这么几种。
文档中说明,如果添加一个节点,需要能被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)
生成这样一个图。
但是呢,我们希望能够画的更加美观一点,起码把颜色改一下,把label显示出来。
我们可以使用下面的代码
nx.draw(G, pos=nx.random_layout(G), node_color='r',with_labels=True)
其中,pos表示位置,由于这时候我们的node并没有给出坐标,因此nx.random_layout会自动设定一个合理的位置。node_color表示节点的颜色,此处设为了红色,with_labels表示显示节点的标签。
我们输出图片看一看
此时就比刚才的看起来舒服一些了。
如果大家想要做出更好更精美的图,可以参照这个网站
http://networkx.github.io/
如需本文的数据和代码,可以公众号后台进行索取。
这篇文章这么水,我也不好意思求大家点“在看了”...