【问题标题】:Python matplotlib blit and update a textPython matplotlib blit 并更新文本
【发布时间】:2016-08-22 18:11:36
【问题描述】:

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

我有一个类,其中包含一个 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的时候,前面的文字出现在后面。我希望它消失!

第二:事实上,我更喜欢将它作为无花果文本,在任何轴之外。听起来可行吗?

你是最棒的,非常感谢。

【问题讨论】:

    标签: python matplotlib blit


    【解决方案1】:

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

    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 不支持不属于任何轴的艺术家,因此在这种情况下您可能需要重新定义 @ 987654328@支持这个。

    【讨论】:

    • 谢谢蒂姆!出于某种原因,我认为我必须远离 mpl.animation,但那是完美的。我将尝试将其改编为 Figure.text 。再次感谢。
    • 我已经向 matplotlib 提交了bug report 关于不支持这种行为的信息。我想我很快就会提交补丁,但在那之前,你只需要重新定义ArtistAnimation._init_draw 方法以使用artist.get_figure() 而不是artist.axes.figure
    • @TimFuchs 你好!在更复杂的情况下,您是否只是将所有要制作动画的艺术家推入ArtistAnimation 构造函数,然后照常更新它们而不关心ax.draw_artist(...)figure.canvas.blit(ax.bbox)?我正在关注this solution,它可以工作,但是在需要时保存对艺术家的引用和恢复背景会产生很多开销。它也仅适用于数据,但不适用于标题和标签...
    • @Guimute 是的,我相信是的。 ArtistAnimation 应该为您处理所有重绘和 blitting。
    猜你喜欢
    • 2013-11-19
    • 2016-04-03
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 2021-10-18
    • 2015-03-13
    • 1970-01-01
    相关资源
    最近更新 更多