使用 matplotlib 结合 FuncAnimation 生成动态图
FuncAnimation 是 matplotlib.animation 模块中的一个类,能让我们高效创建动态可视化效果。
代码解释:
-
blit=False
:在 FuncAnimation 中,将 blit 参数设置为 False,会导致每次更新时重绘整个图形区域,而不仅仅是更新部分内容。这可以确保坐标轴刻度的更新被正确显示,因为整个图形区域都会被重新绘制。 -
init
函数:ax.set_xlim(0, 2 * np.pi)
:设置初始 x 轴范围为 [0, 2 * np.pi]。ax.set_ylim(-1, 1)
:设置初始 y 轴范围为 [-1, 1]。
-
update
函数:xdata.append(frame) 和 ydata.append(np.sin(frame))
:添加新的数据点。ax.set_xlim(min(xdata), max(xdata))
和ax.set_ylim(min(ydata) - 0.1, max(ydata) + 0.1)
:根据新的数据点更新坐标轴范围。ln.set_data(xdata, ydata)
:更新数据点的显示。ax.relim()
:重新计算数据范围的内部表示。ax.autoscale_view()
:根据重新计算的数据范围调整坐标轴范围和刻度标签。ax.set_xticks(np.linspace(min(xdata), max(xdata), num=5))
和ax.set_yticks(np.linspace(min(ydata) - 0.1, max(ydata) + 0.1, num=5))
:根据新的数据范围手动设置 x 轴和 y 轴的刻度,确保刻度能够反映新的数据范围。
demo 代码:
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np
fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = ax.plot([], [], 'ro')
def init():
ax.set_xlim(0, 2 * np.pi)
ax.set_ylim(-1, 1)
return ln,
def update(frame):
xdata.append(frame)
ydata.append(np.sin(frame))
ln.set_data(xdata, ydata)
if frame > 2 * np.pi:
ax.set_xticks(np.linspace(min(xdata), max(xdata), num=10))
return ln,
ani = FuncAnimation(fig, update, frames=np.linspace(0, 2 * np.pi * 100, 128 * 100),
init_func=init, blit=False, interval=50, repeat=True)
plt.show()
demo 实例:
打点图改为线图
上方代码中的
ln, = ax.plot([], [], 'ro')
改为
ln, = ax.plot([], [], 'r-')