python NetworkX库生成并绘制带权无向图

作者:orion-orion 时间:2023-06-09 08:56:58 

NetworkX是一个非常强大的网络科学工具,它封装了图的数据结构和许多经典图算法,也内置了许多可视化函数可供调用。

1. 随机图生成

最经典的随机图当属我们在上一篇博客《Erdos-Renyi随机图的生成方式及其特性》中讲到的Erdős-Rény随机图了,我们这里选用其中的Gnp𝐺np形式,调用以下API:

G = nx.erdos_renyi_graph(10, 0.3, seed=1)

这里表示生成10个顶点的图,且图的每条边都以0.3的概率产生。

当然,此时生成的图不具有权重,我们想在此基础上均匀随机初始化[0, 0.4]之间的权重,可以这样写:

G = nx.Graph()
for u, v in nx.erdos_renyi_graph(10, 0.3, seed=1).edges():
   G.add_edge(u, v, weight=random.uniform(0, 0.4))

2. 2D布局可视化

随机图生成好之后,我们就要对其进行可视化了。首先我们需要计算每个节点在图中摆放的位置,经典的Fruchterman-Reingold force-directed 算法可以完成这个操作,对应NetworkX中的spring_layout函数:

pos = nx.spring_layout(G, iterations=20) #我们设算法迭代次数为20次

然后就可以分别绘制图的边、节点和节点标签了:

nx.draw_networkx_edges(G, pos, edge_color="orange")
nx.draw_networkx_nodes(G, pos, node_color="black")
nx.draw_networkx_labels(G, pos, font_color="white")
plt.show()

绘图结果如下:

python NetworkX库生成并绘制带权无向图

当然,这样图的权值是无法体现于图上的,如果我们需要图的权值体现于图上,可以使图中边的宽度按照权值大小来设置:

nx.draw_networkx_edges(G,pos, width=[float(d['weight']*10) for (u,v,d) in G.edges(data=True)], edge_color="orange")
nx.draw_networkx_nodes(G,pos, node_color="black")
nx.draw_networkx_labels(G, pos, font_color="white")
plt.show()

此时的绘图结果如下:

python NetworkX库生成并绘制带权无向图

3. 3D布局可视化

如果你觉得2D布局过于扁平,还不够直观地体现节点之间的拓扑关系,那你可以采用如下的代码对图进行三维可视化:

# 3d spring layout
pos = nx.spring_layout(G, dim=3, seed=779)
# Extract node and edge positions from the layout
node_xyz = np.array([pos[v] for v in sorted(G)])
edge_xyz = np.array([(pos[u], pos[v]) for u, v in G.edges()])
# Create the 3D figure
fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")
# Plot the nodes - alpha is scaled by "depth" automatically
ax.scatter(*node_xyz.T, s=100, ec="w")
# Plot the edges
for vizedge in edge_xyz:
   ax.plot(*vizedge.T, color="tab:gray")
def _format_axes(ax):
   """Visualization options for the 3D axes."""
   # Turn gridlines off
   ax.grid(False)
   # Suppress tick labels
   for dim in (ax.xaxis, ax.yaxis, ax.zaxis):
       dim.set_ticks([])
   # Set axes labels
   ax.set_xlabel("x")
   ax.set_ylabel("y")
   ax.set_zlabel("z")
_format_axes(ax)
fig.tight_layout()
plt.show()

此时的绘图结果如下:

python NetworkX库生成并绘制带权无向图

参考

  • [1] https://networkx.org/documentation/stable/reference/

来源:https://www.cnblogs.com/orion-orion/p/16256657.html

标签:python,NetworkX,带权图,无向图
0
投稿

猜你喜欢

  • PyCharm安装库numpy失败问题的详细解决方法

    2023-05-18 22:45:16
  • 红黑树的插入详解及Javascript实现方法示例

    2024-04-19 11:03:13
  • Python fileinput模块使用实例

    2021-11-28 09:01:18
  • 基于Vue实现图书管理功能

    2024-04-27 16:16:59
  • Pandas Matplotlib保存图形时坐标轴标签太长导致显示不全问题的解决

    2023-07-22 20:03:09
  • MySQL 线上日志库迁移实例

    2024-01-25 12:40:22
  • 分享很实用的css圆角写法[百度有啊提取]

    2009-01-06 13:05:00
  • vue使用el-upload上传文件及Feign服务间传递文件的方法

    2024-04-28 10:54:45
  • 为什么相对PHP黑python的更少

    2024-05-21 10:20:51
  • python适合人工智能的理由和优势

    2021-08-10 11:01:12
  • Python制作一个多功能音乐播放器

    2022-06-15 10:16:05
  • vue混入mixin流程与优缺点详解

    2024-05-02 16:35:12
  • python实现在内存中读写str和二进制数据代码

    2022-03-30 04:55:11
  • Python针对给定列表中元素进行翻转操作的方法分析

    2022-04-19 18:37:07
  • python下的opencv画矩形和文字注释的实现方法

    2022-12-26 22:27:17
  • Python测试框架pytest核心库pluggy详解

    2023-11-01 23:02:08
  • 如何获得ADO的连接信息?

    2009-11-23 20:33:00
  • Python使用SocketServer模块编写基本服务器程序的教程

    2023-09-19 12:44:12
  • Golang高性能持久化解决方案BoltDB数据库介绍

    2024-01-27 00:13:37
  • 未能加载文件或程序集“XXX”或它的某一个依赖项。试图加载格式不正确的程序。

    2023-07-01 00:38:21
  • asp之家 网络编程 m.aspxhome.com