Python matplotlib blit并更新文本

时间:2016-08-22 09:09:47

标签: python matplotlib blit

我知道这个话题经常出现,但经过多次尝试,搜索和放弃后,我会把它带回给你。

我有一个类,其中包含一个matplotlib图。在这个图中,我想要一个文本,当用户点击某个键时,文本会更新为某些内容,而不会在轴上绘制所有重要内容。看起来我需要在这里搞一个人,但是怎么样?这是一个工作的例子,直到现在我能做到的最好。

import matplotlib as mpl
mpl.use('TkAgg')
import matplotlib.pyplot as plt
import numpy as np

class textUpdater:
    def __init__(self):
        self.fig, self.ax = plt.subplots()
        # self.text = plt.figtext(.02, .14, 'Blibli')
        self.text = self.ax.text(0, .5, 'Blabla')#, transform = self.ax.transAxes)#, animated=True)

        self.fig.canvas.mpl_connect('key_press_event', self.action)
        self.fig.canvas.draw()

        plt.show()

    def action(self, event):
        if event.key == 'z':
            self.text.set_text('Blooooo')
            self.ax.draw_artist(self.text)
            self.fig.canvas.blit(self.text.get_window_extent())

textUpdater()

第一个问题:当bliting事物时,前面的文字出现在后面。我希望它消失了!

第二:我实际上更喜欢将它作为无花果文本,从任何轴开始。这听起来可行吗?

你是最好的,非常感谢。

1 个答案:

答案 0 :(得分:2)

之前的文字仍然落后,因为你从未删除它 - 你只是在它上面画了。为了防止这种情况,你应该将图形保存在文本所在的位置,然后显示文本,然后,当文本发生变化时,恢复保存的背景并重新显示文本。

matplotlib.ArtistAnimation已经为你做了所有这些,所以你可以使用它:

import matplotlib as mpl
mpl.use('TkAgg')
import matplotlib.pyplot as plt
from matplotlib.animation import ArtistAnimation
import numpy as np

class textUpdater:
    def __init__(self):
        self.fig, self.ax = plt.subplots()
        self.text = self.ax.text(.5, .5, 'Blabla')

        self.fig.canvas.mpl_connect('key_press_event', self.action)
        self.fig.canvas.draw()

        self.animation = ArtistAnimation(self.fig, [(self.text,)])

        plt.show()

    def action(self, event):
        if event.key == 'z':
            self.text.set_text('Blooooo')

textUpdater()

现在,对于您的第二个问题,Figure.text将创建一个仅属于该图的文本,但ArtistAnimation不支持不属于任何轴的艺术家,所以在这种情况下,您可能会想重新定义ArtistAnimation以支持此功能。