Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python matplotlib blit和更新文本_Python_Matplotlib_Blit - Fatal编程技术网

Python matplotlib blit和更新文本

Python matplotlib blit和更新文本,python,matplotlib,blit,Python,Matplotlib,Blit,我知道这个话题经常会突然出现,但经过多次尝试、搜索和放弃,我会把它带回给你们 我有一个类,它包含一个matplotlib图。在这个图中,我需要一个文本,当用户点击某个键时,文本会更新为某个内容,而不会在轴上绘制所有沉重的东西。看起来我需要在这里找个人,但是怎么做呢?这是一个有效的例子,是迄今为止我能得到的最好的例子 import matplotlib as mpl mpl.use('TkAgg') import matplotlib.pyplot as plt import numpy as n

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

我有一个类,它包含一个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()
第一个问题:当快速播放该内容时,前面的文本显示在后面。我要它消失

第二:事实上,我更愿意把它作为一个无花果文本,从任何轴。听起来可行吗


你是最好的,非常感谢。

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

已经为您完成了所有这些,因此您可以直接使用它:

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()

现在,对于您的第二个问题,我们将创建一个只属于图形的文本,但是
ArtistAnimation
不支持不属于任何轴的艺术家,因此在这种情况下,您可能需要重新定义
ArtistAnimation
以支持此操作。

谢谢Tim!出于某种原因,我认为我必须远离mpl.animation,但是的,这太完美了。我会试着把这个东西改成图形。再次感谢。我已经向matplotlib提交了一份关于不支持这种行为的文件。我想我很快就会提交一个补丁,但在此之前,您只需要重新定义使用
artist.get_figure()
的方法,而不是
artist.axes.figure
@TimFuchs Hi!在更复杂的情况下,您是否只需将所有要制作动画的艺术家推到
ArtistAnimation
构造函数中,然后像往常一样更新它们,而不必关心
ax.draw\u artist(…)
figure.canvas.blit(ax.bbox)
?我在下面,它可以工作,但在需要时保存对艺术家的引用和恢复背景会有很多开销。它也只适用于数据,而不适用于标题和标签…@Guimoute是的,我相信是这样。
ArtistAnimation
应该为您处理所有的重画和布景。