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。

猜你喜欢

转载自blog.csdn.net/leviopku/article/details/107018547
今日推荐