首页 > 解决方案 > 无法为 Line2D 设置动画

问题描述

我正在尝试为imshow笔记本中的对象设置动画。代码相当长,但我认为这个带有 a 的较短示例Line2D显示了同样的问题。首先,如果有帮助,我有一个可行的替代设计:

import matplotlib.pyplot as plt
import ipywidgets as widgets

series = [[3,1,1,2], [4,6,4,3], [2,6,8,7]]

def f(n):
    fig,ax = plt.subplots()
    ax.plot(series[n])

slider = widgets.IntSlider(min=0, max=len(series)-1)
widgets.interact(f, n=slider);

由于我不需要在每一帧重新创建图形和 ax,我的实际代码是:

import matplotlib.pyplot as plt
import ipywidgets as widgets

series = [[3,1,1,2], [4,6,4,3], [2,6,8,7]]
fig,ax = plt.subplots()
h = ax.plot(series[0]) # Some plot is required to get a Line2D object
h = h[0] # Line2D object

def f(n):
    h.set_ydata(series[n])

slider = widgets.IntSlider(min=0, max=len(series)-1)
widgets.interact(f, n=slider);

此代码不起作用,显示了第一帧,但移动滑块时没有更新。我想知道这是否与h在回调函数之外定义的事实有关f,但在我的实际情况下,我在函数之外定义了其他变量,这些变量被正确处理。

标签: pythonmatplotlibanimationjupyter-notebook

解决方案


我不确定这是否是最好的方法,但您可以使用IPython.display来更新图形。

以下对我有用:

from IPython.display import display
import matplotlib.pyplot as plt
import ipywidgets as widgets

series = [[3,1,1,2], [4,6,4,3], [2,6,8,7]]
fig,ax = plt.subplots()
h = ax.plot(series[0]) # Some plot is required to get a Line2D object
h = h[0] # Line2D object
plt.close() # Prevent normal display

def f(n):
    h.set_ydata(series[n])
    display(fig) # Display in widget
    
slider = widgets.IntSlider(min=0, max=len(series)-1)
widgets.interact(f, n=slider);

推荐阅读