python3 绘制三维空间圆的散点图

python 没有方便好用的直接画圆的方法,一般而言,都是使用参数方程画圆,要在三维空间画圆,可利用三维空间中圆的参数方程:
图片来源于 http://blog.sina.com.cn/s/blog_6496e38e0102vi7e.html

{ x ( θ ) = c 1 + r c o s ( θ ) a 1 + r s i n ( θ ) b 1 y ( θ ) = c 2 + r c o s ( θ ) a 2 + r s i n ( θ ) b 2 z ( θ ) = c 3 + r c o s ( θ ) a 3 + r s i n ( θ ) b 3 \left\{ \begin{array}{cl} x(\theta)=c_1+r cos(\theta)a_1 + r sin(\theta)b_1 \\ y(\theta)=c_2+r cos(\theta)a_2+ r sin(\theta)b_2 \\ z(\theta)=c_3+r cos(\theta)a_3 + r sin(\theta)b_3 \end{array} \right . x(θ)=c1+rcos(θ)a1+rsin(θ)b1y(θ)=c2+rcos(θ)a2+rsin(θ)b2z(θ)=c3+rcos(θ)a3+rsin(θ)b3

其中 ( a 1 , a 2 , a 3 ) (a_1, a_2, a_3) (a1,a2,a3) ( b 1 , b 2 , b 3 ) (b_1, b_2, b_3) (b1,b2,b3)代表圆面内的单位向量 a ⃗ \vec{a} a b ⃗ \vec{b} b ,它们相互垂直,且都垂直于圆的法向量 n ⃗ \vec{n} n ( c 1 , c 2 , c 3 ) (c_1, c_2, c_3) (c1,c2,c3)为圆心坐标。

因为这里我的需求是生成空间圆的散点图(带噪声)用于聚类试验用,所以代码里加了一些噪声。

在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D # 绘制3d散点图

# center 为圆心,n 为圆法向量,noise 为噪声范围, r为半径
def generate_3D_circle(sample_num = 100, r = 1.8, noise = 0.3, center = [0, 0, 0], n = [1, 0, 0]):
    sample = np.linspace(-np.pi, np.pi, sample_num)
    
    a = np.cross(n, [1, 0, 0]) # np.cross(), 向量叉积
    if np.all(a == 0):  # a 是否为0向量
        a = np.cross(n, [0, 1, 0])

    b = np.cross(n, a)  

    # 归一化a,b(圆面两个互垂直向量)
    a = a / np.linalg.norm(a)
    b = b / np.linalg.norm(b)

    # 利用空间圆的参数方程生成圆
    c1 = center[0] * np.ones((sample_num, 1))
    c2 = center[1] * np.ones((sample_num, 1))
    c3 = center[2] * np.ones((sample_num, 1))

    [c_x, c_y, c_z] = c1 + r*a[0]*np.cos(sample) + r*b[0]*np.sin(sample),\
                      c2 + r*a[1]*np.cos(sample) + r*b[1]*np.sin(sample),\
                      c3 + r*a[2]*np.cos(sample) + r*b[2]*np.sin(sample)

    # 加噪声
    nos1 = 0.2 * np.random.normal(1.3, noise, sample_num)
    nos2 = 0.2 * np.random.normal(1.1, noise, sample_num)
    nos3 = 0.2 * np.random.normal(1.1, noise, sample_num)
    c_y += nos1
    c_x += nos2
    c_z += nos3

    return c_x, c_y, c_z


# 散点生成
x=[]

x.append(generate_3D_circle(center=[2, 2, 0], n = [-1, 1, 0]))
x.append(generate_3D_circle(center=[-2, 2, 0], n = [1, 1, 0]))
x.append(generate_3D_circle(center=[2, -2, 0], n = [1, 1, 0]))
x.append(generate_3D_circle(center=[-2, -2, 0], n = [-1, 1, 0]))
x.append(generate_3D_circle(center=[0, 0, 0], n = [0, 0, 1]))


# 绘制散点图
fig = plt.figure()
ax = Axes3D(fig)
for i in x:
    ax.scatter(i[0], i[1], i[2])


# X, Y, Z = [], [], []
# for i in x:
#     X.append(i[0])
#     Y.append(i[1])
#     Z.append(i[2])
# ax.scatter(X, Y, Z)
plt.show()

参考

http://blog.sina.com.cn/s/blog_6496e38e0102vi7e.html

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 可以使用Python的三维数据可视化库如 Matplotlib、Mayavi 来绘制三维散点图。 下面是使用Matplotlib绘制三维散点图的示例代码: ``` import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = Axes3D(fig) x = [1,2,3,4,5,6,7,8,9,10] y = [2,3,4,5,1,6,2,1,7,2] z = [1,2,6,3,2,7,3,3,2,1] ax.scatter(x, y, z) plt.show() ``` 通过运行上述代码,就可以得到一个三维散点图。 ### 回答2: Python是一种非常强大的编程语言,可以用来进行各种数据可视化操作,包括绘制三维散点图。要用Python绘制三维散点图,我们可以使用Matplotlib库和mpl_toolkits.mplot3d模块。 首先,我们需要安装Matplotlib库。可以使用pip命令在终端中输入以下命令进行安装: ``` pip install matplotlib ``` 然后,我们可以使用以下代码来绘制三维散点图: ```python import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 创建一个figure对象和一个三维坐标系 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 生成一些三维散点数据 x = [1, 2, 3, 4, 5] y = [2, 4, 6, 8, 10] z = [3, 6, 9, 12, 15] # 绘制三维散点图 ax.scatter(x, y, z) # 设置坐标轴的标签 ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') # 显示图形 plt.show() ``` 在上述代码中,我们首先导入必要的库,然后创建一个figure对象和一个三维坐标系。接下来,我们生成一些三维散点数据,然后使用ax.scatter()函数绘制三维散点图。最后,我们使用ax.set_xlabel()、ax.set_ylabel()和ax.set_zlabel()设置坐标轴的标签。最后,使用plt.show()显示图形。 通过这个简单的例子,我们可以看到Python非常方便地实现了三维散点图绘制。可以根据实际需求进一步美化图形,并加入更多的数据以及其他可视化元素。 ### 回答3: Python有很多流行的库可以用来绘制三维散点图,其中最常用的是matplotlib库中的mpl_toolkits.mplot3d和plotly库。 首先介绍mpl_toolkits.mplot3d。这个工具包提供了一个类似于二维绘图的接口,但可以在三维空间中进行可视化。要在matplotlib中创建一个三维散点图,需要导入需要的模块,创建一个Figure对象和Axes3D对象,然后使用scatter函数绘制散点图。 下面是一个使用mpl_toolkits.mplot3d绘制三维散点图的示例代码: ```python import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 创建一个Figure对象和Axes3D对象 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 假设有一些数据点,可以通过x、y、z数组来表示 x = [1, 2, 3, 4, 5] y = [6, 7, 8, 9, 10] z = [11, 12, 13, 14, 15] # 使用scatter函数绘制散点图 ax.scatter(x, y, z) # 设置坐标轴标签 ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') # 显示图像 plt.show() ``` 另一个流行的库plotly也可以用来绘制三维散点图。plotly是一个交互式数据可视化库,可以在网页上展示,并且具有很多互动功能。 下面是使用plotly绘制三维散点图的示例代码: ```python import plotly.graph_objects as go # 假设有一些数据点,可以通过x、y、z数组来表示 x = [1, 2, 3, 4, 5] y = [6, 7, 8, 9, 10] z = [11, 12, 13, 14, 15] # 创建一个Scatter3d对象 fig = go.Figure(data=[go.Scatter3d(x=x, y=y, z=z, mode='markers')]) # 设置坐标轴标签 fig.update_layout(scene=dict(xaxis_title='X', yaxis_title='Y', zaxis_title='Z')) # 显示图像 fig.show() ``` 以上就是使用Python绘制三维散点图的两种方法,你可以根据自己的需求选择适合的库和方法来实现。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值