尝试在Jupyter笔记本中获取旋转箭头的动画。 无法正确显示窗口大小和圆圈。
我正在尝试在matplotlib中获得旋转箭头的动画。这是我为学生制作的一本jupyter工程力学书的一部分。
这个问题的想法是动画展示了节点上多个矢量(代码中的黑点)的二维力平衡是什么。
动画基于以下三个来源: 1)Drawing a shape 2)Matplotlib animation 3)Arrow animation
get_ipython().run_line_magic('matplotlib', 'inline')
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as patches
from matplotlib import animation, rc
from IPython.display import HTML
from math import degrees,radians,cos,sin,atan,acos,sqrt
# Create figure
fig, ax = plt.subplots()
# Axes labels and title are established
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_ylim(-100,100) #<---- This window size is not displayed
ax.set_xlim(-100,100) #<---- This window size is not displayed
ax.set_aspect('equal', adjustable='box')
#the circle
circle = plt.Circle((0, 0), radius=10, fc='black')
plt.gca().add_patch(circle) #<---- The circle is not displayed
#arrow1 (more arrows will me added)
arrow1x=[]
arrow1y=[]
arrow1dx=[]
arrow1dy=[]
for t in range(1000):
if t <= 250:
arrow1x.append(0)
arrow1y.append(0)
arrow1dx.append(t/250*100)
arrow1dy.append(0)
elif t <= 500:
arrow1x.append(0)
arrow1y.append(0)
arrow1dx.append(100)
arrow1dy.append(0)
elif t <= 750:
arrow1x.append(0)
arrow1y.append(0)
arrow1dx.append(100*cos(radians((t-500)/250*180.)))
arrow1dy.append(100*sin(radians((t-500)/250*180.)))
else:
arrow1x.append(0)
arrow1y.append(0)
arrow1dx.append((100-100*(t-750)/250)*-sin(radians((t-750)/250*180.)))
arrow1dy.append((100-100*(t-750)/250)*-sin(radians((t-750)/250*180.)))
patch = patches.Arrow(arrow1x[0], arrow1y[0], arrow1dx[0], arrow1dy[0])
#the animation (I have no idea how this works:)
def init():
ax.add_patch(patch)
return patch,
def animate(t):
ax.clear()
patch = plt.Arrow(arrow1x[t], arrow1y[t], arrow1dx[t], arrow1dy[t])
ax.add_patch(patch)
return patch,
anim = animation.FuncAnimation(fig, animate, init_func=init,
frames=1000, interval=20,
blit=True)
HTML(anim.to_jshtml())
作为此代码的结果,我想看到一个范围为(-100 x 100,-100 y 100),黑色节点和箭头的正方形屏幕。
我看到的是一个方形屏幕(0 x 1,0 y 1),旋转的箭头,没有黑点。
在jupyter中没有错误输出,这使得这确实很难理解。另外,代码的编译时间非常长,这也是网页所不希望的,如果这样花费的时间太长,我想我应该在预先编译的图像中查找(可能的提示吗?)。
由于某种原因,未采用窗口大小和点,但据我所知,按照网页上的描述采用了源代码。
答案 0 :(得分:0)
您不恰当地使用了“箭头动画”。由于您的绘图上有静态元素,因此您不想完全清除animate
:应该在执行ax.clear()
函数的过程中删除一个补丁。只需将global patch
ax.patches.remove(patch)
替换为下一行:
{{1}}