目前处理非欧数据最常见的方法还是构建图,而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。