У меня есть фигура / холст matplotlib в окне wxpython. Я хочу обновлять некоторую информацию о сюжете по мере перемещения мыши. Я подключился к «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 для его отображения.