学Python5️⃣3️⃣ 实战Vibe Coding 图:一个“口”字
作者:小号🎺
上次的图论起步,用了三个点,建立了一个3×3的矩阵(邻接矩阵),画出了对应的可视化图。(🔗学Python5️⃣1️⃣ 实战VibeCoding 图论起步(Graph ABC))
三个节点的邻接矩阵:
[0.5, 1.0, 0.0],[0.2, 0.0, 0.8],[0.0, 1.8, 0.0]
3×3的邻接矩阵及其可视化图比较简单。

上次只有3个点,小号想:多加一个点,会是什么情况?于是便求助于AI。
问题:
有4个点,像汉字“口”那样构成一个正方形。“口”字的书写笔划就是有向图的方向。这样成立吗?能够构建出对应的邻接矩阵吗?能够可视化吗?能不能用代码演示一下?
AI回答(小号整理):
是的。像“口”字那样有4个点,对应的就用一个4×4的邻接矩阵。
[0, 1, 0, 1], # 0 -> 1 (上横), 0 -> 3 (左竖)[0, 0, 1, 0], # 1 -> 2 (右竖)[0, 0, 0, 0], # 2 无出边[0, 0, 1, 0] # 3 -> 2 (下横)
像“口”字那样,用它的书写笔划来代表点与点之间的连接及其方向,也是成立的。这是有向图。

相应的可视化代码(Python版)如下:
import numpy as npimport networkx as nximport matplotlib.pyplot as plt# 中文字体设置 - 放在所有绘图代码之前plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'SimSun']plt.rcParams['axes.unicode_minus'] = False# 4个节点:0(左上), 1(右上), 2(右下), 3(左下)A = np.array([[0, 1, 0, 1], # 0 -> 1 (上横), 0 -> 3 (左竖)[0, 0, 1, 0], # 1 -> 2 (右竖)[0, 0, 0, 0], # 2 无出边[0, 0, 1, 0] # 3 -> 2 (下横)])G = nx.DiGraph(A) # networkx 可以直接从邻接矩阵读取# 为了视觉上像“口”,固定节点位置pos = {0: (0, 1), # 左上1: (1, 1), # 右上2: (1, 0), # 右下3: (0, 0) # 左下}fig, ax = plt.subplots(figsize=(6, 6))nx.draw(G, pos, with_labels=True, node_color='lightgreen',node_size=800, arrows=True, arrowstyle='-|>', arrowsize=20)edge_labels = {(u,v): f'{u}->{v}' for u,v in G.edges()}nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)#plt.tight_layout()plt.title("“口”字,4节点,笔划书写方向,有向图,邻接矩阵 可视化")plt.show()
代码运行截图:

体会:(小号“观察”到的,未确认)
图,只关心点和连接,不关心点的位置。所以,为了让4个点看起来像个“口”字,代码中还加了一段 pos=... 如果没有这个设定,让这4个点自由分布,就有可能像小孩子刚学写字,什么奇形怪状的都有。
好了,休息一下。




