Python/Matplotlib - 快速更新轴上的文本

标签 python text matplotlib

我在 wxpython 窗口中有一个 matplotlib 图/ Canvas 。我想在鼠标四处移动时更新情节的一些信息。我已连接到“motion_notify_event”以获取此信息。

在下面的代码中,绘制了很多随机数据,然后在窗口的状态栏中显示了光标的 x,y 位置。这非常顺利并且效果很好。但是,我真的很想在情节的顶部显示此信息。如果取消注释 cbUpdateCursor 的最后两行,就会显示我想要的行为。然而,当这样做时,移动光标的响应时间非常慢(因为 draw 被调用并且有很多数据,但必须调用 draw 否则文本不会更新)。

我怎样才能加快速度,使光标位置可以显示在图上,但又不会减慢太多?我想我可能需要对 bbox 做些什么?

代码:

import wx
import numpy as np
import matplotlib
matplotlib.use('WXAgg')
from matplotlib.figure import Figure
from matplotlib.widgets import Cursor
from matplotlib.backends.backend_wxagg import \
   FigureCanvasWxAgg as FigCanvas, \
   NavigationToolbar2WxAgg as NavigationToolbar

class wxPlotting(wx.Frame):
   title = 'Test'
   def __init__(self):
      wx.Frame.__init__(self, None, -1, self.title)
      self.time = np.arange(10000)
      self.data = np.random.random(10000)
      self.sb = self.CreateStatusBar()
      self.create_main_panel()
      self.axes.plot(self.time, self.data)
      self.canvas.draw()

   def create_main_panel(self):
      self.panel = wx.Panel(self)
      self.fig = Figure((5.0, 4.0), dpi=100)
      self.canvas = FigCanvas(self.panel, -1, self.fig)
      self.axes = self.fig.add_subplot(111)
      self.text = self.axes.text(0., 1.005, '', transform = self.axes.transAxes)
      self.cursor = Cursor(self.axes, useblit=True, color='red')
      self.canvas.mpl_connect('motion_notify_event', self.cbUpdateCursor)
      self.vbox = wx.BoxSizer(wx.VERTICAL)
      self.vbox.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
      self.panel.SetSizer(self.vbox)
      self.vbox.Fit(self)

   def cbUpdateCursor(self, event):
      if event.inaxes:
         text = 'x = %5.4f, y = %5.4f' % (event.xdata, event.ydata)
         self.sb.SetStatusText(text)
         #self.text.set_text(text)
         #self.canvas.draw()

if __name__ == '__main__':
   app = wx.PySimpleApp()
   app.frame = wxPlotting()
   app.frame.Show()
   app.MainLoop()

基本上我想要类似于使用 pyplot 显示的文本的内容,即运行以下代码时的右下角:

代码:

import matplotlib.pyplot as plt
plt.plot(range(10000), range(10000))
plt.show()

编辑:

在我的实际程序中,我希望静态文本位于 matplotlib 轴内,而不是真正位于其上方。所以我不认为我可以只使用 wxpython statictext 来显示它。

最佳答案

您可以使用 blitting,类似于动画示例 here .

在这种情况下,这会产生非常的性能差异,因为只有一小部分窗口需要重绘。

不幸的是,我无法弄清楚如何在重绘文本时在文本后面设置灰色背景,以匹配其背后的默认图形背景...不过性能非常好。

作为基于您上面代码的独立示例:

import wx
import numpy as np
import matplotlib
matplotlib.use('WXAgg')
from matplotlib.figure import Figure
from matplotlib.widgets import Cursor
from matplotlib.backends.backend_wxagg import \
   FigureCanvasWxAgg as FigCanvas, \
   NavigationToolbar2WxAgg as NavigationToolbar

class wxPlotting(wx.Frame):
   title = 'Test'
   def __init__(self):
      wx.Frame.__init__(self, None, -1, self.title)
      self.time = np.arange(10000)
      self.data = np.random.random(10000)
      self.sb = self.CreateStatusBar()
      self.create_main_panel()
      self.axes.plot(self.time, self.data)
      self.background = self.canvas.copy_from_bbox(self.fig.bbox)
      self.canvas.draw()

   def create_main_panel(self):
      self.panel = wx.Panel(self)
      self.fig = Figure((5.0, 4.0), dpi=100)
      self.canvas = FigCanvas(self.panel, -1, self.fig)
      self.axes = self.fig.add_subplot(111)
      self.text = self.axes.text(0., 1.005, '', transform = self.axes.transAxes, animated=True)
      self.cursor = Cursor(self.axes, useblit=True, color='red')
      self.canvas.mpl_connect('motion_notify_event', self.cbUpdateCursor)
      self.vbox = wx.BoxSizer(wx.VERTICAL)
      self.vbox.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
      self.panel.SetSizer(self.vbox)
      self.vbox.Fit(self)

   def cbUpdateCursor(self, event):
      if event.inaxes:
         text = 'x = %5.4f, y = %5.4f' % (event.xdata, event.ydata)
         self.sb.SetStatusText(text)

         self.canvas.restore_region(self.background)
         self.text.set_text(text)
         self.axes.draw_artist(self.text)
         self.canvas.blit(self.text.get_window_extent())

if __name__ == '__main__':
   app = wx.PySimpleApp()
   app.frame = wxPlotting()
   app.frame.Show()
   app.MainLoop()

关于Python/Matplotlib - 快速更新轴上的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6077017/

相关文章:

python - 在 Kivy 程序中使用各种 Python 包

javascript - 如何在 JavaScript 中调用 Python 变量?

python - 保持原始数组维度的二维数组的 argpartsort/partsort

python - 如何从文件内容重新创建 float 列表列表?

python - 在保存的图像上裁剪 x 轴标签

Python 数据框删除出现频率较低的行

html - 在链接上显示网页内的文本

linux - 如何有效地使用 grep?

python - 在 Python 中绘制 3D 圆柱面图

python - 如何使用 Python 从 y 值查找 x 值