5. Matplotlib(三) - 画三维图

本文介绍了如何在Python中使用matplotlib库创建3D图形,包括设置参数以显示中文,创建三维坐标系,绘制曲线图、散点图,以及处理坐标轴和添加注释。重点讲解了如何使用Axes3D对象进行三维曲面绘制,涉及网格化和参数方程应用。
摘要由CSDN通过智能技术生成
参数配置

​ 为了让图片可以显示中文,需要有必要的参数配置

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

  • 18
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啥都想学的大学生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值