3D绘图之matplotlib

3D绘图

进行绘图之前我们需要导入额外的软件包

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

重点强调

ax.plot_surface(X,Y,Z,rstride = 1,cstride = 1,cmap = 'rainbow')  
# 传入的X,Y,Z均应该是一个二维矩阵,这里和matlab绘图的逻辑完全一致
# 注意,绘制曲面自然而言需要传入一个二维矩阵

第一种指定3d绘图的方法,并绘制曲面图

fig  = plt.figure()
ax = Axes3D(fig)  # 对2D图进行变换,将2D图换为3D图

x = np.arange(-4,4,0.25)
y = np.arange(-4,4,0.25)

# 这部分我已经比较了解了
# 3D绘图前需要对坐标进行网格化
X,Y = np.meshgrid(x,y)  # 需要注意meshgrid是numpy中的函数

Z = np.sin(np.sqrt(X**2+Y**2))

ax.plot_surface(X,Y,Z,rstride = 1,cstride = 1,cmap = 'rainbow')  
# 传入的X,Y,Z均应该是一个二维矩阵,这里和matlab绘图的逻辑完全一致

<mpl_toolkits.mplot3d.art3d.Poly3DCollection at 0x7fd9670e7160>

在这里插入图片描述

绘制3D图的投影

还是很漂亮的

fig  = plt.figure()
ax = Axes3D(fig)  # 对2D图进行变换,将2D图换为3D图

x = np.arange(-4,4,0.25)
y = np.arange(-4,4,0.25)
X,Y = np.meshgrid(x,y)
Z = np.sin(np.sqrt(X**2+Y**2))
ax.plot_surface(X,Y,Z,rstride = 1,cstride = 1,cmap = 'rainbow',alpha=0.5)  

###---绘制投影---
ax.set_zlim([-2,2])
ax.contour(X,Y,Z,zdir = 'z',offset = 1,cmap = 'rainbow')
# help(ax.contour)
ax.view_init(45,45)  # 指定观测的方向,这点还是比较重要的

在这里插入图片描述

第二种指定3d绘图的方法,并绘制多个子图

那么问题自然而然的来了,如果以上面的语法

fig  = plt.figure()
ax = Axes3D(fig)  # 对2D图进行变换,将2D图换为3D图

进行操作的话,我们似乎只能画出一张图,这是很不好的一件事,我们如何画出多个3D图的整体呢?

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

fig = plt.figure()
# 在画布上面利用add_subplot添加子图
ax1 = fig.add_subplot(221,projection = '3d')
ax2 = fig.add_subplot(222,projection = '3d')
ax3 = fig.add_subplot(223,projection = '3d')
ax4 = fig.add_subplot(224,projection = '3d')
plt.show()

在这里插入图片描述

第三种指定3d绘图的方法,并绘制空间曲线

这里还有一种绘制三维图形的方式,但是感觉不实用,放在这里,其实最实用的还是第一种方式和第二种方式(绘制多个3d图像于一个画布时)

! 并没有不实用!这里指定3D绘图的方法虽然不怎么用,但是这里的调用plot传入的三个是一维向量,其中绘制的是空间曲线

fig = plt.figure()
ax = fig.gca(projection = '3d')

theta = np.linspace(-4*np.pi,4*np.pi,100)
z = np.linspace(-2,3,100)
r = z**2+1
x = r*np.sin(theta)
y = r*np.cos(theta)

ax.plot(x,y,z)
plt.show()

在这里插入图片描述

3D图调整视角

ax.view_init(40,20)  # 调整视角
##------
"""这部分内容放在后面,和其他进行实际的操作"""
##------
'这部分内容放在后面,和其他进行实际的操作'

3D绘制散点图

np.random.seed(1)
def randrange(n,vmin,vmax):
    return (vmax-vmin)*np.random.rand(n)+vmin
fig = plt.figure()
ax = fig.add_subplot(111,projection = '3d')
n = 100
# 这么sao的循环我还是第一次碰到
for c,m,zlow,zhigh in [('r','x',-50,-25),('b','x',-30,100)]:
    xs = randrange(n,23,32)
    ys = randrange(n,0,100)
    zs = randrange(n,zlow,zhigh)
    ax.scatter(xs,ys,zs,c=c,marker = m,alpha = 0.7,label = f'c and m:{c} and {m}')
plt.legend()

ax.view_init(40,20)  # 调整视角

plt.show()

在这里插入图片描述

3D的条形图,这也SAO了

图太小了记得

fig = plt.figure(figsize=(10,10))
fig = plt.figure(figsize=(10,10))
ax = fig.add_subplot(111,projection = '3d')

# zip 用于打包数据,以方便python在for循环中一起应用
for c,z in zip(['r','g','b','y'],[30,20,10,0]):
    xs = np.arange(20)
#     ys = np.arange()
    ys = np.random.randn(20)
    ax.bar(xs,ys,zs = z,zdir = 'y',color = c)  # 指定zdir可以让我们的图竖起来
    # 说白了 zdir指定的就是z轴的方向,将z轴(竖直轴)的方向指定为y,听起来很绕口,但其实不难
    # 注意这里用字符串'y'进行指定,其中道理不言而喻

plt.show()

在这里插入图片描述


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值