假设你在一家房地产公司工作,眼下急需分析全城房产分布,并清晰地界定每处房产的市场影响范围。那么,如何在二维平面上直观划分这些势力范围呢? Voro noi 图正是解决此类空间划分问题的利器。
下面我们就通过一个具体案例来实践:生成20处随机房产坐标,绘制其 Voronoi 图,并用不同色块标注影响力区域。
首先,我们需要生成模拟的房产数据。利用 NumPy 设置随机种子并生成 20 个坐标点(范围在 100x100 内):
import numpy as np
np.random.seed(42)
properties = np.random.rand(20, 2) * 100
接下来是核心的可视化部分。我们将使用 SciPy 的 Voronoi 模块进行空间计算,并结合 Matplotlib 完成绘制。
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial import Voronoi
np.random.seed(42)
properties = np.random.rand(20, 2) * 100
vor = Voronoi(properties)
fig, ax = plt.subplots(figsize=(10, 10))
# 绘制 Voronoi 图,去除无穷大的区域
regions = [r for r in vor.regions if -1 not in r and r]
for region in regions:
polygon = [vor.vertices[i] for i in region]
plt.fill(*zip(*polygon), alpha=0.4)
# 绘制房产位置(黑点)
plt.plot(properties[:, 0], properties[:, 1], 'ko', markersize=8)
plt.title('房产分布及影响力区域')
plt.xlabel('X 坐标')
plt.ylabel('Y 坐标')
plt.xlim(0, 100)
plt.ylim(0, 100)
# 添加图例
plt.plot([], [], 'ko', label='房产')
plt.plot([], [], color='C0', alpha=0.4, linewidth=10, label='影响力区域')
plt.legend()
plt.show()

这张图怎么看?图中每个彩色多边形就是一个“影响力区域”,黑色圆点代表“房产”的实际位置。你会发现,任意一点落在某个多边形内,就意味着它距离该多边形内的黑点(房产)最近——这完美回答了“这块区域属于谁”的问题。
让我们拆解一下这段代码的关键步骤:
- 数据准备:
np.random.rand(20, 2) * 100 负责生成 0 到 100 内的随机坐标。固定随机种子 (seed=42) 是保证结果可复现的好习惯。
- 核心计算:
Voronoi(properties) 会依据房产坐标算出所有顶点、边和区域信息。
- 绘制区域:遍历
vor.regions 时,我们特意过滤掉含有 -1 的区(这代表边界向外无限延伸,无法完全绘制)。之后利用顶点坐标构建多边形,并用半透明色填充。
- 标注实体:
plt.plot 配上 'ko' 参数,即黑色实心圆点,精准标记出房产位置。
- 修饰与限定:设置坐标轴范围
xlim 和 ylim,保证视野锁定在数据所在空间。而添加图例的经典技巧其实是绘制了空数据([]),只为在右上角生成对应的图形说明。
这个可视化过程体现了 Python 数据处理与可视化的强大联动:
- 利用 NumPy 快速构造模拟数据
- 借助 SciPy 的空间分析能力进行几何构图
- 通过 Matplotlib 完成复杂的多边形填充和组合图形绘制
延伸知识:Voronoi 图从哪来,还能用在哪?
Voronoi 图由乌克兰数学家 Georgy Voronoi 于 1908 年提出,其背后的思想在大自然中无处不在,比如长颈鹿的斑纹、蜂巢的构造等。
除了房产分析,它的应用边界其实相当宽广:
- 计算几何学:它的“对偶图”是 Delaunay 三角剖分,两者均是几何算法的基础。在二维空间构建 Voronoi 图,基于 Fortune 算法可将时间复杂度控制在
O(n log n)。
- 机器学习:在 K-最近邻 (KNN) 算法中,Voronoi 图提供了直观的几何理解:新数据点将自动归类到其所在区域的主要类别里。
- 宏观扩展:虽然三维以上的 Voronoi 图很难直观展示,但它在高维空间聚类和建模中同样发挥着关键作用。
云栈社区里也有不少朋友在讨论相关话题,当你需要处理“空间划分”、“最近邻”或是计算几何相关的性能调优时,不妨多看看大家踩过的坑和经验分享。希望本文能帮你扎实地迈出空间数据可视化的第一步。