Python matplotlib blit 和更新文本
Python matplotlib blit and update a text
我知道这个话题经常跳出来,但经过多次尝试、搜索和放弃,我把它带回来给你。
我有一个 class,其中包含一个 matplotlib 图。在这个图中,我想要一个文本,当用户按下某个键时,文本会更新为某些内容,而无需在轴上绘制所有沉重的东西。看来我需要在这里 blit 某人,但是怎么做呢?这是一个工作示例,是迄今为止我能做到的最好的示例。
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 thing时,前面的文字出现在后面。我要它消失!
其次:事实上,我更愿意将它作为无花果文本,不受任何轴的影响。听起来可行吗?
你是最棒的,非常感谢。
之前的文字仍然存在,因为您从未删除它 - 您只是在它上面绘制。为了防止这种情况,您应该保存文本所在的图形,然后显示文本,然后,当文本发生变化时,恢复保存的背景并重新显示文本。
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
以支持这一点。
我知道这个话题经常跳出来,但经过多次尝试、搜索和放弃,我把它带回来给你。
我有一个 class,其中包含一个 matplotlib 图。在这个图中,我想要一个文本,当用户按下某个键时,文本会更新为某些内容,而无需在轴上绘制所有沉重的东西。看来我需要在这里 blit 某人,但是怎么做呢?这是一个工作示例,是迄今为止我能做到的最好的示例。
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 thing时,前面的文字出现在后面。我要它消失!
其次:事实上,我更愿意将它作为无花果文本,不受任何轴的影响。听起来可行吗?
你是最棒的,非常感谢。
之前的文字仍然存在,因为您从未删除它 - 您只是在它上面绘制。为了防止这种情况,您应该保存文本所在的图形,然后显示文本,然后,当文本发生变化时,恢复保存的背景并重新显示文本。
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
以支持这一点。