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

2023-11-11 09:59

本文主要是介绍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 += nos1c_x += nos2c_z += nos3return 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

这篇关于python3 绘制三维空间圆的散点图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/389271

相关文章

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画

Python3中Sanic中间件的使用

《Python3中Sanic中间件的使用》Sanic框架中的中间件是一种强大的工具,本文就来介绍Python3中Sanic中间件的使用,具有一定的参考价值,感兴趣的可以了解一下... 目录Sanic 中间件的工作流程中间件的使用1. 全局中间件2. 路由中间件3. 异常处理中间件4. 异步中间件5. 优先级

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户