在matplotlib中没有ArtistAnimations的情况下动态更新补丁图

时间:2018-10-31 23:37:43

标签: python matplotlib

我有一个外部服务,有时会触发函数Environment.getExternalStorageState() —检查下面的代码—以更新用{{1}绘制的 Polygon 补丁}。

callback(points)

但是,这不起作用...该图未更新。 matplotlibfig, ax = plt.subplots() polygon = Polygon([[0, 0]]) patches = [] patches.append(polygon) collection = PatchCollection(patches, animated=True, alpha=0.4) ax.add_collection(collection) ax.autoscale_view(True) plt.show() def callback(points): polygon.set_xy(points) fig.canvas.draw() fig.canvas.flush_events() 不是正确的电话吗?

我在网上看到了其他使用canvas.draw的示例,但由于无法模拟输入内容,因此无法使用。相反,它们来自调用canvas.flush_events的外部服务。

我该如何进行这项工作?谢谢!

1 个答案:

答案 0 :(得分:0)

好的,我稍加修改了this example(它使用了UpdatablePatchCollection),并且现在可以使用了。

这是一个可行的最小示例:

%matplotlib notebook  # Use this on Jupyter Notebooks

import matplotlib.collections as mcollections
import matplotlib.pyplot as plt
import matplotlib as mpl
import time


class UpdatablePatchCollection(mcollections.PatchCollection):
    def __init__(self, patches, *args, **kwargs):
        self.patches = patches
        mcollections.PatchCollection.__init__(self, patches, *args, **kwargs)

    def get_paths(self):
        self.set_paths(self.patches)
        return self._paths


plt.ion()

rect = mpl.patches.Rectangle((0,0),1,1)
collection = UpdatablePatchCollection([rect])

fig, ax = plt.subplots()

ax.set_xlim(0,5)
ax.set_ylim(0,3)

ax.add_artist(collection)


def update_plot(i):
    rect.set_xy((i,1))

    fig.canvas.draw()
    fig.canvas.flush_events()


for i in range(5):
    time.sleep(0.5)
    update_plot(i)

此部分对于每帧“ 渲染”很重要。

fig.canvas.draw()
fig.canvas.flush_events()

并注意重要的plt.ion()通话。如果没有它,该图将无法交互地对补丁集进行更改。