[Python] 三维散点/曲线/曲面 ( 含有笔记、代码、注释 )

291 篇文章 0 订阅

3D散点

## 3D散点
import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

xs1 = np.random.randint(30,40,100)
ys1 = np.random.randint(20,30,100)
zs1 = np.random.randint(10,20,100)
xs2 = np.random.randint(50,60,100)
ys2 = np.random.randint(30,40,100)
zs2 = np.random.randint(50,70,100)
xs3 = np.random.randint(10,30,100)
ys3 = np.random.randint(40,50,100)
zs3 = np.random.randint(40,50,100)

# 方式1:设置三维图形模式
fig = plt.figure() # 创建一个画布figure,然后在这个画布上加各种元素。
ax = Axes3D(fig) # 将画布作用于 Axes3D 对象上。

ax.scatter(xs1,ys1,zs1) # 画出(xs1,ys1,zs1)的散点图。
ax.scatter(xs2,ys2,zs2,c='r',marker='^')
ax.scatter(xs3,ys3,zs3,c='g',marker='*')

ax.set_xlabel('X label') # 画出坐标轴
ax.set_ylabel('Y label')
ax.set_zlabel('Z label')

plt.show()

在这里插入图片描述

3D曲线

import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

# 设置图例字号
mpl.rcParams['legend.fontsize'] = 10

# 方式2:设置三维图形模式
fig = plt.figure()
ax = fig.gca(projection='3d')

# 测试数据
theta = np.linspace(-4 * np.pi, 4 * np.pi, 100)
z = np.linspace(-4, 4, 100) / 4
r = z**3 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)

# 绘制图形
ax.plot(x, y, z, label='parametric curve')

# 显示图例
ax.legend()

# 显示图形
plt.show()

在这里插入图片描述

3D曲线拟合(含噪音)

# 不含噪声散点图
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

# 设置图例字号
mpl.rcParams['legend.fontsize'] = 10

# 方式2:设置三维图形模式
fig = plt.figure()
ax = fig.gca(projection='3d')

# 测试数据
x = np.linspace(-4 * np.pi, 4 * np.pi, 30)
y = x
z = x * x

ax.scatter(x,y,z) # 画出(x,y,z)的散点图。

运行结果:

<mpl_toolkits.mplot3d.art3d.Path3DCollection at 0x2e7d13350d0>
在这里插入图片描述

# 不含噪声曲线图
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

# 设置图例字号
mpl.rcParams['legend.fontsize'] = 10

# 方式2:设置三维图形模式
fig = plt.figure()
ax = fig.gca(projection='3d')

# 测试数据
x = np.linspace(-4 * np.pi, 4 * np.pi, 30)
y = x
z = x * x

# 绘制图形
ax.plot(x, y, z, label='parametric curve')

# 显示图例
ax.legend()

# 显示图形
plt.show()

在这里插入图片描述

# 含噪声散点图
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

# 设置图例字号
mpl.rcParams['legend.fontsize'] = 10

# 方式2:设置三维图形模式
fig = plt.figure()
ax = fig.gca(projection='3d')

# 测试数据
x = np.linspace(-4 * np.pi, 4 * np.pi, 30) 
y = x + np.random.randn(y.shape[-1]) * 2.5
z = x * x 

ax.scatter(x,y,z) # 画出(x,y,z)的散点图。

运行结果:

<mpl_toolkits.mplot3d.art3d.Path3DCollection at 0x2e7cf46fbe0>
在这里插入图片描述

# 含噪声曲线图
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

# 设置图例字号
mpl.rcParams['legend.fontsize'] = 10

# 方式2:设置三维图形模式
fig = plt.figure()
ax = fig.gca(projection='3d')

# 测试数据
x = np.linspace(-4 * np.pi, 4 * np.pi, 30) 
y = x + np.random.randn(x.shape[-1]) * 2.5
z = x * x 

# 绘制图形
ax.plot(x, y, z, label='parametric curve')

# 显示图例
ax.legend()

# 显示图形
plt.show()

在这里插入图片描述

# 含噪声曲线拟合图
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt


# 设置图例字号
mpl.rcParams['legend.fontsize'] = 10

# 方式2:设置三维图形模式
fig = plt.figure()
ax = fig.gca(projection='3d')

# 测试数据
x = np.linspace(-4 * np.pi, 4 * np.pi, 30) 
y = x + np.random.randn(x.shape[-1]) * 0.7
z = x * x 

# 绘制图形
ax.plot(x, y, z, label='parametric1 curve')

p_yx = np.polyfit(y,x,2);
x_out = np.polyval(p_yx, y);
p_yz = np.polyfit(y,z,2);
z_out = np.polyval(p_yz, y);
ax.plot(x_out, y, z_out, label='parametric2 curve') 

# 显示图例
ax.legend()

# 显示图形
plt.show()

# 拟合是拟合出一个误差小的曲线,这里并不包括光滑,当噪音大时,拟合的曲线不光滑。

在这里插入图片描述

3D曲面

import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax3 = plt.axes(projection='3d')

plt.rcParams['font.sans-serif']=['FangSong'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号

#定义三维数据
xx = np.arange(-5,5,0.5)
yy = np.arange(-5,5,0.5)
X, Y = np.meshgrid(xx, yy)
Z = np.sin(X)+np.cos(Y)

#作图
ax3.plot_surface(X,Y,Z,cmap='rainbow') 
# 改变cmap参数可以控制三维曲面的颜色组合, 一般我们见到的三维曲面就是 rainbow 的

plt.show()

在这里插入图片描述

曲面颜色

import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

'''使用figure对象'''
fig = plt.figure()
'''创建3D轴对象'''
ax = Axes3D(fig)
'''X坐标数据'''
X = np.arange(-2,2,0.1)
'''Y坐标数据'''
Y = np.arange(-2,2,0.1)
'''计算3维曲面分格线坐标'''
X,Y = np.meshgrid(X,Y)
'''用于计算X/Y对应的Z值'''
def f(x,y):
    return (1-y**5+x**5)*np.exp(-x**2-y**2)
'''plot_surface函数可绘制对应的曲面'''
ax.plot_surface(X,Y,f(X,Y),rstride=1,cstride=1,cmap=plt.cm.cool) # 通过修改camp修改曲面颜色
'''显示'''
plt.show()

在这里插入图片描述

曲面旋转

import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

'''使用figure对象'''
fig = plt.figure()
'''创建3D轴对象'''
ax = Axes3D(fig)
'''X坐标数据'''
X = np.arange(-2,2,0.1)
'''Y坐标数据'''
Y = np.arange(-2,2,0.1)
'''计算3维曲面分格线坐标'''
X,Y = np.meshgrid(X,Y)
'''用于计算X/Y对应的Z值'''
def f(x,y):
    return (1-y**5+x**5)*np.exp(-x**2-y**2)
'''plot_surface函数可绘制对应的曲面'''
ax.plot_surface(X,Y,f(X,Y),rstride=1,cstride=1,cmap=plt.cm.hot)
'''旋转'''
ax.view_init(elev=30,azim=125)
'''显示'''
plt.show()

在这里插入图片描述

3D条形图

import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(8)
y = np.random.randint(0,10,8)

y2 = y + np.random.randint(0,3,8)
y3 = y2 + np.random.randint(0,3,8)
y4 = y3 + np.random.randint(0,3,8)
y5 = y4 + np.random.randint(0,3,8)

clr = ['red','green','blue','black','white','yellow','orange','pink']

fig = plt.figure()
ax = Axes3D(fig)

ax.bar(x,y,0,zdir='y',color=clr)
ax.bar(x,y2,10,zdir='y',color=clr)
ax.bar(x,y3,20,zdir='y',color=clr)
ax.bar(x,y4,30,zdir='y',color=clr)
ax.bar(x,y5,40,zdir='y',color=clr)

ax.set_xlabel('X label')
ax.set_ylabel('Y label')
ax.set_zlabel('Z label')

plt.show()

在这里插入图片描述

附录01:三维绘图函数Axes3D

① mpl_toolkits.mplot3d是Matplotlib里面专门用来画三维图的工具包。

② Axes3D是mpl_toolkits.mplot3d中的一个绘图函数。

③ 创建 Axes3D主要有两种方式,一种是利用关键字projection='3d’来实现,另一种则是通过从mpl_toolkits.mplot3d导入对象Axes3D来实现,目的都是生成具有三维格式的对象Axes3D。

附录02:.view_init(elev,azim)

① elev为仰角,azim为方位角。

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、Python必备开发工具

在这里插入图片描述

三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

五、Python练习题

检查学习结果。
在这里插入图片描述

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

上述这份完整版的Python全套学习资料已经上传CSDN官方,如果需要可以微信扫描下方CSDN官方认证二维码 即可领取

👉[[CSDN大礼包:《python安装包&全套学习资料》免费分享]]安全链接,放心点击

  • 5
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中常用的用于绘制三维散点图的库有matplotlib和plotly等,其中matplotlib是比较常用的。假设我们已经读取了一个包含三维坐标的数据集,可以将其表示为一个3列的numpy数组,其中每一行对应着一个三维点的坐标。为了在matplotlib中绘制三维散点图,首先需要导入相应的模块: ``` import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D ``` 接着,我们可以尝试将三维点绘制出来: ``` x = np.random.rand(100) y = np.random.rand(100) z = np.sin(x * y) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter(x, y, z) ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') plt.show() ``` 上面的代码使用了numpy库中的rand函数生成了100个随机的三维点坐标,并使用sin函数计算出了点的Z坐标。然后通过matplotlib和mpl_toolkits模块绘制出了散点图。需要注意的是,我们使用了projection='3d'参数来告诉matplotlib我们需要绘制的是一个三维图像。另外,可通过set_xlabel,set_ylabel,set_zlabel三个函数对坐标轴进行命名。 对于三维散点图的拟合曲面,可以使用scipy库中的interpolate函数进行插值处理。在我们已有的散点数据集上,我们可以利用二维的插值函数生成一个拟合曲面(也就是对原来的数据进行了一个平滑的拟合)。下面的代码展示如何使用interpolate函数生成一个拟合曲面: ``` from scipy.interpolate import griddata # 生成拟合曲面所需的网格点 xi = np.linspace(min(x), max(x), 50) yi = np.linspace(min(y), max(y), 50) X, Y = np.meshgrid(xi, yi) # 利用插值函数生成Z坐标值 Z = griddata((x, y), z, (X, Y), method='cubic') # 绘制拟合曲面 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.plot_surface(X, Y, Z, cmap='coolwarm') ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') plt.show() ``` 在上面的代码中,我们使用了griddata函数对数据进行了一个二维插值,生成了一个平滑的拟合曲面,最后使用plot_surface函数绘制了这个曲面。需要注意的是,这里绘制的拟合曲面并不完全是原始散点数据的一个真实的“表面”,而仅仅是一个在散点数据周围的平滑曲面。不过,对于数据的可视化而言,这种方法已经足够了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值