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()