7.1 使用mplot3绘制3D图表
7.1.1 mplot3D概述
mplot3d 是 matplotlib中专门经制 3D图表的工具包,它主要包含一个继承自 Axes 的子类Axes3D,使用 Axes3D 类可以构建一个三维坐标系的绘图区城。matpl otlib 可以通过两和方式创建 Axes3D 类的对象:一种方式是 Axes:3D()方法,另一种方式是add_subplot()方法,具体介绍如下。
1 .Axes3D()方法
Axes3D()是构造方法,它直接用于构建一个Axes3D类的对象,Axes3D()方法的语法格式如下:
Axes 3D (fig,rect-None,*args,azim=-60, elev=30,zscale=None,sharez=None,
proj_type='persp',**kwargs)
2 .add_subplot()方法
在调用add_subplot()方法添加绘图区域时为该方法传入projection=‘3d’,即指定坐标系的类型为三维坐标系,返回一个Axes3D的对象
7.1.2 绘制常见的3D图表
1.绘制3D线框图
Axes3D类的对象使用plot_wireframe()方法绘制框线图,plot_wireframe()方法的语法格式如下所示:
plot_wireframe(self,x,y,z,*args,**kwargs)
案例一:绘制3D线框图 (1)示例代码如下:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10)
plt.title("2020080603052")
plt.show()
(2)运行代码,如果如下:
2.绘制3D曲面图
Axes3D类的对象使用plot_surface()方法绘制3D曲面图,该方法的语法格式如下:
plot_surface(self,x,y,z,*args,norm=None,vmin=None,vmax=None,lightsource=None,**kwargs)
案例二:绘制3D曲面图 (1)代码如下:
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np
x1 = np.arange(-5, 5, 0.25)
y1 = np.arange(-5, 5, 0.25)
x1, y1 = np.meshgrid(x1, y1)
r1 = np.sqrt(x1** 2 + y1 ** 2)
z1 = np.sin(r1)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(x1, y1, z1, cmap=cm.coolwarm, linewidth=0, antialiased=False)
ax.set_zlim(-1.01, 1.01)
plt.title("2020080603052")
plt.show()
(2)运行代码,结果如下: 案例三:三维空间的星星 (1)运行代码:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
x = np.random.randint(0, 40, 30)
y = np.random.randint(0, 40, 30)
z = np.random.randint(0, 40, 30)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
for xx, yy, zz in zip(x, y, z):
color = 'y'
if 10 < zz < 20:
color = '#C71585'
elif zz >= 20:
color = '#008B8B'
ax.scatter(xx, yy, zz, c=color, marker='*', s=160, linewidth=1, edgecolor='black')
ax.set_xlabel('x轴')
ax.set_ylabel('y轴')
ax.set_zlabel('z轴')
ax.set_title('3D散点图 2020080603052', fontproperties='simhei', fontsize=14)
plt.tight_layout()
plt.show()
(2)运行代码,结果如下:
7.2 使用animation制作动图
相对于静态表而言,添加了动画的动态图表更加生动形象,更能激发用户继续探索数据热情。
7.2.1 animation概述
matplotlib在1.1版本的标准库中加入了动画模块——animation,使用该模块的Animation类可以实现一些基本的动画效果。
1.FuncAnimation类
FuncAnimation是基于函数的动画类,它通过重复调用同一函数来制作动画。FuncAnimation类的构造方法的语法格式如下:
FuncAnimation(fig,func,frames=None,init_func=None,fargs=None,save_count=None,*,cache_frame_data=True,**kwarges)
案例四:实现正弦曲线移动 (1)实现代码:
```python
%matplotlib qt5
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
x = np.arange(0, 2 *np.pi, 0.01)
fig, ax = plt.subplots()
line, = ax.plot(x, np.sin(x))
def animate(i):
line.set_ydata(np.sin(x + i / 10.0))
return line
def init():
line.set_ydata(np.sin(x))
return line
ani = FuncAnimation(fig=fig, func=animate, frames=100,
init_func=init, interval=20, blit=False)
plt.title("2020080603052")
plt.show()
(2)运行代码,结果如下:
2. ArtisAnimation类
ArtisAnimation是基于一组Artist对象的动画类,它通过一帧一帧的数据制作动画。 ArtisAnimation类的构造方法的语法格式如下:
ArtisAnimation(fig,artists,interval,repeat_delay,repeat,blit,*args,**kwargs)
案例五:移动的正弦曲线: (1)运行代码:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import ArtistAnimation
x = np.arange(0, 2 * np.pi, 0.01)
fig, ax = plt.subplots()
arr = []
for i in range(5):
line = ax.plot(x, np.sin(x + i))
arr.append(line)
ani = ArtistAnimation(fig=fig, artists=arr, repeat=True)
plt.title("2020080603052")
plt.show()
(2)运行代码,实现结果: 案例六:三维空间闪烁的星星 (1)运行代码:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.animation import FuncAnimation
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
xx = np.array([13, 5, 25, 13, 9, 19, 3, 39, 13, 27])
yy = np.array([4, 38, 16, 26, 7, 19, 28, 10, 17, 18])
zz = np.array([7, 19, 6, 12, 25, 19, 23, 25, 10, 15])
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
star = ax.scatter(xx, yy, zz, c='#C71585', marker='*', s=160,
linewidth=1, edgecolor='black')
def animate(i):
if i % 2:
color = '#C71585'
else:
color = 'white'
next_star = ax.scatter(xx, yy, zz, c=color, marker='*', s = 160, linewidth=1, edgecolor='black')
return next_star
def init():
return star
ani = FuncAnimation(fig=fig, func=animate, frames=None, init_func =init, interval=1000, blit=False)
ax.set_xlabel('x轴')
ax.set_ylabel('y轴')
ax.set_zlabel('z轴')
ax.set_title('3D散点图,2020080603052', fontproperties='simhei', fontsize=14)
plt.tight_layout()
plt.show()
(2)运行代码,结果如下:
|