度分佈圖引發的折騰

事情的起因,是我要在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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章