参数配置
为了让图片可以显示中文,需要有必要的参数配置
plt.rcParams['font.sans-serif'] = 'SimHei' # 可以显示中文
plt.rcParams['axes.unicode_minus'] = False # 可以显示负号
1. 创建三维坐标系
-
使用
plt.axes()
直接创建from mpl_toolkits.mplot3d import Axes3D ax: Axes3D = plt.axes('projection = '3d) # 返回一个Axes3D对象,用于后续画图 plt.show() #展示三维坐标系
-
使用
plt.figure()
创建画布from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax: Axes3D = fig.add_subplot(projection = '3d') # 返回一个Axes3D对象,用于后续画图
-
使用
Axes3D()
创建from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = Axes3D(fig) # 返回一个Axes3D对象,用于后续画图 fig.add_axes(ax) # 解决画布显示空白问题 plt.show()
-
在定义变量
ax
时,显式指明了其类型为Axes3D
可以解决在部分版本中,pycharm无法进行代码提示的窘境from mpl_toolkits.mplot3d import Axes3D # 导入Axes3D类 ax : Axes3D = plt.axes(projection = '3d') # 显式指明ax为Axes3D ax : Axes3D = fig.add_subplot(projection = '3d') # 显式指明ax为Axes3D
2. 绘制曲线和散点图
-
绘制曲线图
figure = plt.figure(figsize=(5, 5)) ax : Axes3D = figure.add_subplot(projection = '3d') # 创建3d画布 z = np.linspace(0, 20, 1000) x = 6*np.cos(z) y = 4*np.sin(z) # 数据 ax.plot(x, y, z) # 绘图 plt.show()
ax.plot(x, y,z)
:绘制空间曲线图,同二维plt.plot()
有类似的参数设置
-
绘制散点图
figure = plt.figure(figsize=(5, 5)) ax : Axes3D = figure.add_subplot(projection = '3d') # 创建3d画布 z = np.linspace(0, 20, 200) x = 6*np.cos(z) y = 4*np.sin(z) # 数据 ax.scatter(x, y, z) # 绘图 plt.show()
ax.scatter(x, y, z)
: 绘制空间散点图,同二维plt.scatter()
有类似的参数设置
-
坐标轴的设置
figure = plt.figure(figsize=(5, 5)) ax : Axes3D = figure.add_subplot(projection = '3d') # 创建画布 z = np.linspace(0, 20, 200) x = 6*np.cos(z) y = 4*np.sin(z) # 设置数据 ax.plot(x, y, z,color = 'r') # 绘图 # 设置坐标轴标签 ax.set_xlabel("x轴") ax.set_ylabel('y轴') ax.set_zlabel('z轴') # 设置坐标轴取值范围 ax.set_xlim(-7, 7) ax.set_ylim(-5, 5) ax.set_zlim(0, 20) # 设置x轴的刻度替代编号 ax.set_xticks([-7, 0, 7], ['a', 'b', 'c']) # 设置图表题 ax.set_title("3d螺旋线") # 给(0, cos(0), sin(0))点添加注释 ax.text(0, np.cos(0), np.sin(0), s='(0, 1, 0)') plt.show()
ax.set_xlabel()
: 设置标签ax.set_xlim()
: 设置取值范围ax.set_xticks()
: 设置刻度ax.set_title()
: 设置标题ax.text()
: 添加注释
3. 绘制三维曲面
绘制三维曲面,需要结合曲面方程。以绘制$ x2+y2+z^2=1 $ 为例,使用参数方程表示为
{
x
=
s
i
n
α
∗
c
o
s
θ
y
=
s
i
n
α
∗
s
i
n
θ
z
=
c
o
s
α
α
∈
(
0
,
π
)
θ
∈
(
0
,
2
π
)
\begin{cases} x = sin\alpha *cos\theta \\ y = sin\alpha * sin\theta \\ z = cos\alpha \\ \alpha \in (0, \pi) \\ \theta \in (0, 2\pi) \end{cases}
⎩
⎨
⎧x=sinα∗cosθy=sinα∗sinθz=cosαα∈(0,π)θ∈(0,2π)
figure = plt.figure(figsize=(5, 5))
ax: Axes3D = figure.add_subplot(projection='3d')
alpha = np.linspace(0, np.pi, 1000)
theta = np.linspace(0, 2 * np.pi, 1000) # 两个参数的取值范围
alpha, theta = np.meshgrid(alpha, theta) # 两个参数要进行网格化,必须要的一步
x = np.sin(alpha) * np.cos(theta)
y = np.sin(alpha) * np.sin(theta)
z = np.cos(alpha) # 定义参数方程
ax.plot_surface(x, y, z, # 传入数据
cmap=plt.get_cmap('rainbow')) #设置颜色
ax.contourf(x, y, z, zdir='z', offset=-1) # 绘制在z = -1的平面上的投影
plt.show()
- 绘制曲面图时,需要对两个变量进行网格化
np.meshgrid()
- 当曲面方程为 z = f ( x , y ) z = f(x, y) z=f(x,y) 时,需要对x、y进行网格化
- 当曲面方程为 z = f ( x ( α , θ ) , y ( α , θ ) ) z = f(x(\alpha, \theta), y(\alpha, \theta)) z=f(x(α,θ),y(α,θ)) 时, 需要对 α 、 θ \alpha、 \theta α、θ进行网格化
ax.plot_surface()
用于绘制曲面- 传入的x,y,z是网格化,或者网格化数据的运算结果
cmap=plt.get_cmap('')
用于设置颜色,常见的颜色有:- 彩虹色: ‘rainbow’
- 红色: ‘Reds’
- 紫色: ‘Purples’
- 灰色: ‘Greys’ 不一一列举
ax.contourf()
用于绘制曲面的投影zdir='x' offset=-1
同时使用,表示绘制在x = -1这个平面上的投影
如有错误,还请指正,持续更新ing