networkx+python構建圖結構數據並可視化

目前處理非歐數據最常見的方法還是構建,而networkx一個專門的構建圖數據的工具。方便又好用。

先給鏈接:https://networkx.github.io/

官方文檔https://networkx.github.io/documentation/latest/

networkx的安裝方法上面的官方文檔已經很詳細記錄,阿盞就不贅述了。

官方文檔裏給了幾個demo,雖然便利,但泛化性不強。我這邊給一個泛化性強一些的demo:

import networkx as nx
import matplotlib.pyplot as plt

g = nx.Graph()
g.add_edge('1', '2')
g.add_edge('2', '3')
g.add_edge('1', '4')
g.add_edge('2', '4')
fig, ax = plt.subplots()
nx.draw(g, ax=ax)
plt.show()

咱們構建的圖數據就是g,看得出來一共有['1', '2', '3', 4'']四個節點。可視化結果爲:

就一張光禿禿的點棍圖,可以把節點label加上,只需設置with_labels=True:

import networkx as nx
import matplotlib.pyplot as plt

g = nx.Graph()
g.add_edge('1', '2')
g.add_edge('2', '3')
g.add_edge('1', '4')
g.add_edge('2', '4')
fig, ax = plt.subplots()
nx.draw(g, ax=ax, with_labels=True) # show node label
plt.show()

有沒有發現每次可視化,圖節點的位置是隨機任性擺放的。如果想固定節點的位置,也是可以的:

import networkx as nx
import matplotlib.pyplot as plt

g = nx.Graph()
g.add_edge('1', '2')
g.add_edge('2', '3')
g.add_edge('1', '4')
g.add_edge('2', '4')

pos_dict = {'1':[ 1,  1], '2': [ 1.5,  0.8], '3': [ 1.7,  2.8], '4': [ 0.6,3.3]}
positions=nx.spring_layout(G, pos=pos_dict)

fig, ax = plt.subplots()
nx.draw(g, ax=ax, with_labels=True, pos=positions)
plt.show()

如上輸入每個節點在可視化中的座標,就可以把節點固定在一個位置。這樣,無論運行多少次,其可視化結果也只會是一個樣子:

這麼看還是不夠帥氣,如果我想用不同顏色來展示節點呢?

import networkx as nx
import matplotlib.pyplot as plt

g = nx.Graph()
g.add_edge('1', '2')
g.add_edge('2', '3')
g.add_edge('1', '4')
g.add_edge('2', '4')

fixed_position = {'1':[ 1,  1], '2': [ 1.5,  0.8], '3': [ 1.7,  2.8], '4': [ 0.6,3.3]}
pos=nx.spring_layout(g, pos=fixed_position)

colors = []
for i in range(g.number_of_nodes()):
    if i == 2:
        colors.append('#ff0000')
    else:
        colors.append('#1f7814')

fig, ax = plt.subplots()
nx.draw(g, ax=ax, with_labels=True, pos=pos, node_color=colors) # add colors
plt.show()

無非再增加一個colors的list,咱們看看效果:

由於上一步一定固定了節點,所以,這一步只加顏色show出來的圖形狀跟上一步是一樣的。

需要注意的是,colors只是list,沒有跟每個節點綁定,只是按順序綁定。節點順序在networkx是先進先出的,比如你先add_edge('1', '3')再add_edge('1', '2'),這個時候'2'是第三個節點,而'2'只是第三個節點的label。

想要解決順序對應問題,可以先add_node。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章