Pymnet 笔记:使用Python 绘制多层网络

hxy    2020-02-13 08:31


听说最近Pyment无法访问了,准备搞个镜像,去去就来。
不对啊,没开代理可以直接访问啊。。。
以下为原文内容:
——————————分割线——————————————
        
之前写过一个博客基于Python的多层网络可视化包Multinetx,也可以绘制多层网络,感兴趣的小伙伴可以翻看。 
​​介绍
        根据官方手册的介绍,pymnet 库可参考如下链接:
        pymnet 库可以生成多层和多路复用网络的图像。 库中绘制网络图像的主要使用了 Matplotlib , 支持矢量格式(例如 pdf 或 svg)及光栅格式(例如 png)。 此外还可以使用 Javascript 和 d3.js 绘制网络图片,这样就可以使用浏览器查看这些交互式图形了。

安装
        进入:https://bitbucket.org/bolozna/multilayer-networks-library/src/default/ 下载之后,解压,然后可以使用
python setup.py install
        或者简单粗暴地直接 放入 python_path -> Lib -> site-packages 里面。

注意:如果遇到 No model named pymmnet 这样的错误提示,请注意是否注释掉了默认的 sample 代码。

使用
        新建 test.py, 粘贴如下示例代码:
from pymnet import *
fig=draw(er(10,3*[0.4]),layout="spring")
fig.savefig('test.pdf')
        打开生成的 pdf, 效果如下:
Fig.1  3层随机网络可视化结果

        看,是否似曾相似 对,就是 Kivela 的 Multilayer networks 综述[1]里的多层网络可视化效果,支持 aspect 的那种。
        使用的时候,需要保存到本地pdf,如果按照官方提示给出的
from pymnet import *
net = models.er_multilayer(5,2,0.2)
fig = draw(net, show=True)
是看不出来结果的。并且控制台会提示:UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure. % get_backend()),该问题是因为这段代码默认是在命令行执行,没有可视化交互界面导致的,可在代码中添加如下内容:
import matplotlib
matplotlib.use('TkAgg')
即可以预览方式呈现。

真实网络数据集可视化
        这个可视化工具支持 邻接矩阵,以 bkfrat.dat 数据集为例,输入如下代码:
from pymnet import *

net = read_ucinet("bkfrat.dat", couplings="none")
net = transforms.threshold(net, 4)
fig = draw(net,
           show=True,
           layout="spring",
           layerColorRule={},
           defaultLayerColor="gray",
           nodeLabelRule={},
           edgeColorRule={"rule": "edgeweight",
                          "colormap": "jet", "scaleby": 0.1}
           )
fig.savefig('bkfrat.pdf')
得到的结果如下:
Fig.2  bkfrat.dat 数据集的可视化效果
 
————更新@2020-6-26 18:04:13————

感谢 xxxxxin 同学提醒自定义函数的用法,更新一下代码:
from pymnet import *

net = read_ucinet("bkfrat.dat", couplings="none")
net = transforms.threshold(net, 4)
fig = draw(
    net,
    show=True,
    layout="spring",
    layerColorRule={},
    defaultLayerColor="gray",
    nodeLabelRule={},
    edgeColorRule={
        "rule": "edgeweight",
        "colormap": "jet", 
        "scaleby": 0.1,
        'f':lambda x=net: func(x)
    }
)
fig.savefig('bkfrat.pdf')


def func(x):
    ''' 自定义函数 '''
    print('自定义函数的参数:',x)
    return 1
这里面的**Rule参数里支持自定义函数,比如想统一修改边权值对应的colormap样式,可以设置某种计算,我这里都设置为1了,也就是边权值都更改为1,不区分颜色了,效果如图:
Fig.3 添加自定义函数设置绘图时边权重都为1
注:这里的自定义函数格式并不是lambda:x=net:函数名(x),只是为了传参这样写的,如果不传参可以直接写f:函数名的格式。


参考资料:
  1. Multilayer Networks. Mikko Kivela, Alexandre Arenas, Marc Barthelemy, James P. Gleeson, Yamir Moreno, Mason A. Porter, arXiv:1309.7233 [physics.soc-ph]
  2. Multilayer Networks Library for Python (Pymnet). http://www.mkivela.com/pymnet/index.html
  3. UCINET IV Datasets. http://vlado.fmf.uni-lj.si/pub/networks/data/ucinet/ucidata.htm#bkfrat



 
Last Modified: 2021-02-03 11:25
Views: 16.1K

[[total]] comments

Post your comment
  1. [[item.time]]
    [[item.user.username]] [[item.floor]]Floor
  2. Click to load more...
  3. Post your comment