我正在学习 本课 关于用Python求解热方程。该课程指出,在求解热方程后,我们可以通过在循环中简单地调用 pyplot.plot() 来可视化解的动画图,其中下面的代码将动态绘制每次每个点的温度,从而得到一个动画情节(课程帖子中提供了动画情节的示例)。
import numpy
from matplotlib import pyplot
length = 2
k = .466
temp_left = 200
temp_right = 200
total_time = 4
dx = .1
x_vec = numpy.linspace(0, length, int(length/dx))
dt = .0001
t_vec = numpy.linspace(0, total_time, int(total_time/dt))
u = numpy.zeros([len(t_vec), len(x_vec)])
u[:, 0] = temp_left
u[:, -1] = temp_right
for t in range(1, len(t_vec)-1):
for x in range(1, len(x_vec)-1):
u[t+1, x] = k * (dt / dx**2) * (u[t, x+1] - 2*u[t, x] +
u[t, x-1]) + u[t, x]
pyplot.plot(x_vec, u[t], 'black')
pyplot.pause(.001)
pyplot.cla()
pyplot.plot(x_vec, u[0])
pyplot.ylabel("Temperature (C˚)")
pyplot.xlabel("Distance Along Rod (m)")
pyplot.show()
我刚刚学习编码,这对我来说是全新的。我正在使用 jupyter 笔记本版本 7.1.2。我将代码放入 jupyter 笔记本单元中,运行该单元,并期望得到一个动态图。相反,我得到的是许多静态图。
我查看了此处的示例 ,看看是否可以修改代码以适用于我的应用程序。在尝试每个示例时,我都会得到一个空白数字,如下所示: to see if I can modify the code to work for my application. In trying every example I would get a blank figure, like so:
你遇到的问题是,在 Jupyter 笔记本中,
pyplot.pause(.001)
并不会创建真正的动画。在像脚本一样运行时,
pyplot.pause(.001)
会暂停执行,显示图像,然后在继续之前清除图像。然而,在 Jupyter 笔记本中,绘图命令会一直累积,直到循环结束,此时会显示所有图像,给人一种静态输出的感觉。
为了在 Jupyter 笔记本中创建动态绘图,你需要使用
matplotlib.animation
模块。下面是使用
FuncAnimation
函数修改后的代码:
import numpy
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
length = 2
k = .466
temp_left = 200
temp_right = 200
total_time = 4
dx = .1
x_vec = numpy.linspace(0, length, int(length/dx))
dt = .0001
t_vec = numpy.linspace(0, total_time, int(total_time/dt))
u = numpy.zeros([len(t_vec), len(x_vec)])
u[:, 0] = temp_left
u[:, -1] = temp_right
for t in range(1, len(t_vec)-1):
for x in range(1, len(x_vec)-1):
u[t+1, x] = k * (dt / dx**2) * (u[t, x+1] - 2*u[t, x] +
u[t, x-1]) + u[t, x]
# 创建图形和坐标轴
fig, ax = plt.subplots()
# 创建初始线条
line, = ax.plot(x_vec, u[0], 'black')
# 定义更新函数
def animate(i):
line.set_ydata(u[i])
return line,
# 创建动画
ani = FuncAnimation(fig, animate, frames=len(t_vec), interval=10, blit=True)
# 设置轴标签
plt.ylabel("Temperature (C˚)")
plt.xlabel("Distance Along Rod (m)")
# 显示动画
plt.show()
这段代码创建了一个动画,其中每个帧都调用
animate
函数来更新线条的数据。
FuncAnimation
函数使用
fig
参数指定图形,使用
animate
参数指定更新函数,使用
frames
参数指定帧数,使用
interval
参数指定帧之间的毫秒数。
blit=True
参数告诉 matplotlib 只更新图中已更改的部分,从而提高动画性能。
这个修改后的代码应该在你的 Jupyter 笔记本中创建一个动态绘图。
标签:python,matplotlib,jupyter-notebook From: 78773171