目前處理非歐數據最常見的方法還是構建圖,而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。