如何用Numpy和Matplotlib绘制带随机散点的两个同心圆
实现带随机散射效果的双环散点图
你原来的代码生成的是完美的同心圆,因为角度是均匀线性分布的,半径没有波动。要实现随机散射效果,核心是用Numpy的随机函数生成随机角度,同时给半径添加随机扰动,让点围绕目标圆环分散分布。
修改后的代码
import numpy as np import matplotlib.pyplot as plt # 定义两个环的目标半径 target_radii = [5, 10] # 每个环的生成点数 num_points = 200 # 半径的随机扰动幅度(值越大,散射越明显) noise_scale = 0.5 # 生成第一个环的随机散射点 angles_1 = np.random.uniform(0, 2 * np.pi, num_points) radii_1 = np.random.normal(target_radii[0], noise_scale, num_points) x_1 = radii_1 * np.cos(angles_1) y_1 = radii_1 * np.sin(angles_1) # 生成第二个环的随机散射点 angles_2 = np.random.uniform(0, 2 * np.pi, num_points) radii_2 = np.random.normal(target_radii[1], noise_scale, num_points) x_2 = radii_2 * np.cos(angles_2) y_2 = radii_2 * np.sin(angles_2) # 绘图设置 plt.axis('equal') plt.scatter(x_1, y_1, c='purple', alpha=0.7) plt.scatter(x_2, y_2, c='yellow', alpha=0.7) plt.show()
关键修改说明
- 随机角度:用
np.random.uniform(0, 2*np.pi, num_points)生成num_points个0到2π之间的随机角度,替代原来的linspace,让点在圆周上随机分布,而非均匀排列。 - 半径扰动:用
np.random.normal(target_r, noise_scale, num_points)给目标半径添加正态分布的随机噪声,让每个点的半径围绕目标值波动,形成散射效果。 - 参数调整:
- 修改
num_points可以增减每个环的点数; - 修改
noise_scale可以控制散射的程度——值越大,点偏离圆环的距离越远;值越小,点越接近完美圆环; - 添加
alpha=0.7让重叠的点更通透,视觉效果更自然。
- 修改
另一种实现思路(坐标加噪声)
如果想在完美圆环的基础上直接给坐标加噪声,也可以这样写:
import numpy as np import matplotlib.pyplot as plt target_radii = [5, 10] num_points = 200 coord_noise = 0.5 # 第一个环 angles = np.random.uniform(0, 2*np.pi, num_points) x_perfect = target_radii[0] * np.cos(angles) y_perfect = target_radii[0] * np.sin(angles) x_1 = x_perfect + np.random.normal(0, coord_noise, num_points) y_1 = y_perfect + np.random.normal(0, coord_noise, num_points) # 第二个环同理 x_perfect_2 = target_radii[1] * np.cos(angles) y_perfect_2 = target_radii[1] * np.sin(angles) x_2 = x_perfect_2 + np.random.normal(0, coord_noise, num_points) y_2 = y_perfect_2 + np.random.normal(0, coord_noise, num_points) plt.axis('equal') plt.scatter(x_1, y_1, c='purple', alpha=0.7) plt.scatter(x_2, y_2, c='yellow', alpha=0.7) plt.show()
这种方式的散射效果和极坐标半径扰动略有不同,你可以根据需求选择。
内容的提问来源于stack exchange,提问作者Wesley Alves
相关产品推荐
相关产品推荐

