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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:29:09