您的位置:首页 > 理论基础 > 计算机网络

度分布图引发的折腾

2016-09-22 00:56 218 查看
事情的起因,是我要在python3.5中用igraph画网络的度分布图。

读入数据、计算度分布,这些都没问题:

import igraph

g = igraph.Graph.Read("/home/sizheng/hdg/sizheng/myfitness/1/3_1_5000.edges",format="edgelist")
dd = g.degree_distribution()


得到的dd是个柱状图对象,可以直接print出来,但是以文本字符构成的横向的示意,不是真正的图像。查了文档,有个内部的方法__plot__,但无法调用。在邮件列表中提问,回复说用plot调用,于是import matplotlib,不行,又问,回复说不是用matplotlib的,而是igraph里面做了一个plot,于是改成这样:

import igraph
from igraph import plot

g = igraph.Graph.Read("/home/sizheng/hdg/sizheng/myfitness/1/3_1_5000.edges",format="edgelist")

dd = g.degree_distribution()
plot(dd)


还是报错。再问,回答说要用到Cairo包,好吧。。。于是开始被Cairo折磨至今。

Centos自带python2.7,我后装了3.5.1。

按照这里的说法,PyCairo1.10需要Cairo-1.14.6和Python-3.5.2,可是Centos7自带的cairo还不到1.10(这里不禁吐槽一下,Centos的包真心更新慢,Boost、gcc什么的,全都落后官方好几个版本),而cairo-1.14.6又要求libpng-1.6.24和Pixman-0.34.0,毫无悬念地,centos的这两个东西版本又不够高。

于是先下载了libpng-1.6.24和Pixman-0.34.0的源码编译安装,其间遇到找不到freetype某个头文件的情况,原来freetype的头文件目录隐藏在/usr/include/freetype2下,在/usr/include/里建个链接过去搞定。

接着装Cairo-1.14.6,没想到又踩到坑:configure之后的Makefile中居然没找到freetype的库目录,编译参数的-L后面是空的,于是编译时会报错,提示说参数-L和后面的-l之间不应该有空格。OMG,这都什么奇葩问题。这个问题困扰了我好一会儿,后来在Makefile里搜-L发现了,手工编辑Makefile添加上去,OK了。这里得注意不要重新configure,否则又要找不到了。

pycairo没有在pip的包管理中,无奈只能下载源码编译安装,可是问题就出在这里。在编译前的configure阶段,针对python3.5的安装就过不去了:总是在生成的Build.py中报一个无法pickle局部对象的错误:

AttributeError: Can't pickle local object 'Context.__init__.<locals>.node_class'


编辑这个Build.py代码,输出一些相关对象的信息,也看不出什么端倪。在这折腾了很久,无奈转回python2.7试试。

python2.7的cairo包叫py2cairo,下载源码,配置、编译安装,居然挺顺利地通过了!把它的Build.py文件同样输出相关对象信息,跟3.5的也没什么本质区别,实在不明白问题出在哪里。要是有哪位大侠遇到并解决过同样的问题,还望不吝赐教啊~

最后,把python2.7中的igraph卸载重装一下,就能顺利地画出度分布图了。但画出来的图不是双对数坐标,看着有点丑。就不上图了,代码如下,很简单,有兴趣的可以试试:

import cairo
import igraph from igraph import plot g = igraph.Graph.Read("/home/sizheng/hdg/sizheng/myfitness/1/3_1_5000.edges",format="edgelist") dd = g.degree_distribution() plot(dd)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息