networkx+python构建图结构数据并可视化

61 篇文章 3 订阅
3 篇文章 2 订阅

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木盏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值