matplotlib动画上的窗口大小不正确

时间:2019-07-14 11:42:49

标签: python-3.x matplotlib jupyter-notebook

尝试在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中没有错误输出,这使得这确实很难理解。另外,代码的编译时间非常长,这也是网页所不希望的,如果这样花费的时间太长,我想我应该在预先编译的图像中查找(可能的提示吗?)。

由于某种原因,未采用窗口大小和点,但据我所知,按照网页上的描述采用了源代码。

1 个答案:

答案 0 :(得分:0)

您不恰当地使用了“箭头动画”。由于您的绘图上有静态元素,因此您不想完全清除animate:应该在执行ax.clear()函数的过程中删除一个补丁。只需将global patch ax.patches.remove(patch) 替换为下一行:

{{1}}