如何在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,提问作者袁皓诚
相关产品推荐
相关产品推荐

