voronoi图 python代码
时间: 2023-05-31 11:04:51 浏览: 84
以下是Python代码,用于生成Voronoi图:
```python
import numpy as np
from scipy.spatial import Voronoi, voronoi_plot_2d
import matplotlib.pyplot as plt
# 随机生成点
points = np.random.rand(50, 2)
# 生成Voronoi图
vor = Voronoi(points)
# 绘制Voronoi图
voronoi_plot_2d(vor)
# 显示图形
plt.show()
```
首先,我们生成一个包含50个随机点的二维numpy数组。然后,我们使用`scipy.spatial.Voronoi`函数计算这些点的Voronoi图。最后,我们使用`voronoi_plot_2d`函数绘制Voronoi图。最终的结果将在一个新的窗口中显示。
相关问题
基于Lloyd算法生成Voronoi 图形的python代码
以下是基于Lloyd算法生成Voronoi图形的Python代码:
```python
import random
import numpy as np
import matplotlib.pyplot as plt
# 生成随机点
def generate_points(n, minval, maxval):
return [(random.uniform(minval, maxval), random.uniform(minval, maxval)) for _ in range(n)]
# 计算欧几里得距离
def distance(p1, p2):
return np.sqrt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2)
# 寻找每个点的最近邻
def nearest_neighbor(p, points):
min_dist = float("inf")
for i, point in enumerate(points):
if distance(p, point) < min_dist:
min_dist = distance(p, point)
index = i
return index
# 计算每个点的重心
def calculate_centroid(points):
x = [p[0] for p in points]
y = [p[1] for p in points]
centroid_x = sum(x) / len(points)
centroid_y = sum(y) / len(points)
return (centroid_x, centroid_y)
# Lloyd算法生成Voronoi图形
def lloyd_algorithm(points, n_iterations):
# 初始化中心点
centroids = points[:3]
# 迭代更新中心点
for i in range(n_iterations):
cell_points = [[] for _ in range(len(centroids))]
# 分配点到最近的中心点
for p in points:
index = nearest_neighbor(p, centroids)
cell_points[index].append(p)
# 计算每个中心点的重心
centroids = [calculate_centroid(cell) for cell in cell_points]
return centroids, cell_points
# 绘制Voronoi图形
def plot_voronoi(centroids, cell_points):
for i, cell in enumerate(cell_points):
x = [p[0] for p in cell]
y = [p[1] for p in cell]
plt.scatter(x, y)
plt.scatter(centroids[i][0], centroids[i][1], c='r')
plt.show()
# 测试代码
points = generate_points(100, -10, 10)
centroids, cell_points = lloyd_algorithm(points, 10)
plot_voronoi(centroids, cell_points)
```
代码中,`generate_points`函数生成指定数量的随机点,`distance`函数计算两个点之间的欧几里得距离,`nearest_neighbor`函数寻找每个点的最近邻,`calculate_centroid`函数计算每个点的重心。`lloyd_algorithm`函数是Lloyd算法的实现,它迭代更新中心点,直到收敛。最后,`plot_voronoi`函数绘制Voronoi图形。
使用 python 实现三维 Voronoi 图
以下是一个使用 Python 和 Matplotlib 库实现三维 Voronoi 图的示例代码:
```python
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
from scipy.spatial import Voronoi
# Generate random points
points = np.random.rand(10, 3)
# Compute Voronoi diagram
vor = Voronoi(points)
# Plot Voronoi diagram
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
for i, simplex in enumerate(vor.ridge_vertices):
simplex = np.asarray(simplex)
if np.all(simplex >= 0):
poly = [vor.vertices[simplex[j]] for j in range(simplex.shape[0])]
ax.add_collection3d(Poly3DCollection([poly], alpha=0.25))
ax.scatter(points[:, 0], points[:, 1], points[:, 2], c='k', alpha=1)
plt.show()
```
此代码生成 10 个随机点并计算其 Voronoi 图。然后,使用 `Poly3DCollection` 绘制由 Voronoi 图中的边界形成的多边形。最后,使用 `scatter` 函数将点绘制为黑色。结果是一个三维 Voronoi 图,其中随机点位于黑色点中。