You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中实现含同颜色点的最远点Voronoi图?

解决同颜色点的最远点Voronoi图生成问题

嘿,先澄清一个常见误解:scipy.spatial.Voronoi的furthest_site=True参数和点的“颜色”完全无关!它只需要输入一组点的坐标集合,根本不管这些点是否属于同一类别(颜色)。你提到的“仅支持输入不同颜色的点”应该是混淆了点的分类属性和Voronoi图的生成逻辑——函数本身不关心颜色,颜色只是我们后续可视化时用来区分点的附加信息。

下面分两种最常见的需求给出具体解决方案:

需求1:对所有点生成全局最远点Voronoi图,仅绘图时按颜色区分点

这种场景是把所有点作为整体生成最远点Voronoi划分,只是在画图的时候给同颜色的点标上对应颜色,方便区分。

示例代码

import random
import numpy as np
from scipy.spatial import Voronoi, voronoi_plot_2d
import matplotlib.pyplot as plt

# 生成8个随机点
points = []
for i in range(8):
    points.append((random.randint(0, 10000), random.randint(0, 10000)))
points = np.array(points)

# 给点分配颜色:前4个标红,后4个标蓝(你可以根据自己的实际分类调整)
point_colors = ['red'] * 4 + ['blue'] * 4

# 生成最远点Voronoi图
vor = Voronoi(points, furthest_site=True)

# 开始绘图
fig, ax = plt.subplots()
# 先画Voronoi的边和结构,隐藏默认的点和顶点
voronoi_plot_2d(vor, ax=ax, show_points=False, show_vertices=False, line_colors='gray')
# 按颜色逐个绘制点
for point, color in zip(points, point_colors):
    ax.scatter(point[0], point[1], color=color, s=50, edgecolor='black')

plt.title('全局最远点Voronoi图(按颜色区分点)')
# 稍微扩展坐标轴范围,避免点被截断
plt.xlim(vor.min_bound[0]-500, vor.max_bound[0]+500)
plt.ylim(vor.min_bound[1]-500, vor.max_bound[1]+500)
plt.show()

需求2:针对每个颜色组单独生成最远点Voronoi图

如果你的需求是给每个颜色的点组单独生成对应的最远点Voronoi划分(比如红色点一组,蓝色点一组,各自生成独立的Voronoi图),那只需要先按颜色分组,再对每组单独调用Voronoi函数即可。

示例代码

import random
import numpy as np
from scipy.spatial import Voronoi, voronoi_plot_2d
import matplotlib.pyplot as plt

# 生成8个带颜色标签的随机点
points_with_color = []
for i in range(8):
    x = random.randint(0, 10000)
    y = random.randint(0, 10000)
    color = 'red' if i < 4 else 'blue'
    points_with_color.append((x, y, color))

# 按颜色分组
color_groups = {}
for x, y, color in points_with_color:
    if color not in color_groups:
        color_groups[color] = []
    color_groups[color].append((x, y))

# 为每个颜色组生成并绘制独立的最远点Voronoi图
fig, axes = plt.subplots(1, len(color_groups), figsize=(12, 5))
for ax, (color, group_points) in zip(axes, color_groups.items()):
    # 转换为numpy数组,方便scipy处理
    group_points_np = np.array(group_points)
    # 生成该组的最远点Voronoi图
    vor = Voronoi(group_points_np, furthest_site=True)
    # 绘图,用对应颜色标记边和点
    voronoi_plot_2d(vor, ax=ax, line_colors=color, show_vertices=False)
    ax.scatter(group_points_np[:, 0], group_points_np[:, 1], color=color, s=50, edgecolor='black')
    ax.set_title(f'{color}点组的最远点Voronoi图')
    # 扩展坐标轴范围
    ax.set_xlim(vor.min_bound[0]-500, vor.max_bound[0]+500)
    ax.set_ylim(vor.min_bound[1]-500, vor.max_bound[1]+500)

plt.tight_layout()
plt.show()

额外说明

如果你的“同颜色点”是指需要把同颜色的点合并成一个“超级站点”(比如用同颜色点的质心、或者该组的最远点作为代表),那你需要先计算每个颜色组的代表点,再用这些代表点去生成Voronoi图。比如:

# 示例:用质心作为同颜色点的代表
centroid_points = []
for color, group_points in color_groups.items():
    group_np = np.array(group_points)
    centroid = np.mean(group_np, axis=0)
    centroid_points.append(centroid)
centroid_points = np.array(centroid_points)
# 用质心生成最远点Voronoi图
vor_centroid = Voronoi(centroid_points, furthest_site=True)

内容的提问来源于stack exchange,提问作者袁皓诚

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:28:46