Я пытаюсь расширить учебник по перетаскиванию сюжета, создав подзаговор, который можно перетащить (кривая matplotlib, а не все окно). Я чувствую, что я рядом, но просто не хватает критической детали.Draggable Matplotlib Subplot с использованием wxPython
Большая часть кода только создает подзаголовки резака для печенья, цифра 3 - единственная, где я пытаюсь перетащить данные графика.
Любая помощь будет оценена!
import wxversion
wxversion.ensureMinimal('2.8')
import numpy as np
import matplotlib
matplotlib.interactive(True)
matplotlib.use('WXAgg')
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.figure import Figure
import wx
class DraggableCurve:
def __init__(self,curve):
self.curve = curve[0]
self.press = None
def connect(self):
'connect to all the events we need'
self.cidpress = self.curve.figure.canvas.mpl_connect(
'button_press_event', self.on_press)
self.cidrelease = self.curve.figure.canvas.mpl_connect(
'button_release_event', self.on_release)
self.cidmotion = self.curve.figure.canvas.mpl_connect(
'motion_notify_event', self.on_motion)
def on_press(self, event):
print "on_press"
'on button press we will see if the mouse is over us and store some data'
if event.inaxes != self.curve.axes: return
contains, attrd = self.curve.contains(event)
if not contains: return
print 'event contains', self.curve.xy
x0, y0 = self.curve.xy
# print x0,y0
self.press = x0, y0, event.xdata, event.ydata
def on_motion(self, event):
print "on_motion"
'on motion we will move the curve if the mouse is over us'
if self.press is None: return
if event.inaxes != self.curve.axes: return
x0, y0, xpress, ypress = self.press
print xpress, ypress
dx = event.xdata - xpress
dy = event.ydata - ypress
#print 'x0=%f, xpress=%f, event.xdata=%f, dx=%f, x0+dx=%f'%(x0, xpress, event.xdata, dx, x0+dx)
self.curve.set_x(x0+dx)
self.curve.set_y(y0+dy)
# print x0+dx, y0+dy
#self.curve.figure.canvas.draw()
self.curve.figure.canvas.draw_idle()
def on_release(self, event):
print "on_release"
'on release we reset the press data'
self.press = None
#self.curve.figure.canvas.draw()
self.curve.figure.canvas.draw_idle()
def disconnect(self):
'disconnect all the stored connection ids'
self.curve.figure.canvas.mpl_disconnect(self.cidpress)
self.curve.figure.canvas.mpl_disconnect(self.cidrelease)
self.curve.figure.canvas.mpl_disconnect(self.cidmotion)
class CanvasFrame(wx.Frame):
def __init__(self):
#create frame
frame = wx.Frame.__init__(self,None,-1,
'Test',size=(550,350))
#set background
self.SetBackgroundColour(wx.NamedColour("WHITE"))
#initialize figures
self.figure1 = Figure()
self.figure2 = Figure()
self.figure3 = Figure()
self.figure4 = Figure()
#initialize figure1
self.axes1 = self.figure1.add_subplot(111)
self.axes1.text(0.5,0.5, 'Test 1', horizontalalignment='center', fontsize=15)
self.axes1.get_xaxis().set_visible(False)
self.axes1.get_yaxis().set_visible(False)
self.canvas1 = FigureCanvas(self, -1, self.figure1)
#initialize figure2
self.axes2 = self.figure2.add_subplot(111)
self.axes2.text(0.5,0.5, 'Test 2', horizontalalignment='center', fontsize=15)
self.axes2.get_xaxis().set_visible(False)
self.axes2.get_yaxis().set_visible(False)
self.canvas2 = FigureCanvas(self, -1, self.figure2)
#initialize figure3
self.axes3 = self.figure3.add_subplot(111)
curve = self.axes3.plot(np.arange(1,11),10*np.random.rand(10),color='r',marker='o')
self.canvas3 = FigureCanvas(self, -1, self.figure3)
# self.axes3.get_xaxis().set_visible(True)
# self.axes3.get_yaxis().set_visible(True)
# self.canvas3.draw()
# self.canvas3.draw_idle()
dc = DraggableCurve(curve)
dc.connect()
#initialize figure4
self.axes4 = self.figure4.add_subplot(111)
self.axes4.text(0.5,0.5, 'Test4', horizontalalignment='center', fontsize=15)
self.axes4.get_xaxis().set_visible(False)
self.axes4.get_yaxis().set_visible(False)
self.canvas4 = FigureCanvas(self, -1, self.figure4)
#create figures into the 2x2 grid
self.sizer = wx.GridSizer(rows=2, cols=2, hgap=5, vgap=5)
self.sizer.Add(self.canvas1, 1, wx.EXPAND)
self.sizer.Add(self.canvas2, 1, wx.EXPAND)
self.sizer.Add(self.canvas3, 1, wx.EXPAND)
self.sizer.Add(self.canvas4, 1, wx.EXPAND)
self.SetSizer(self.sizer)
self.Fit()
return
class App(wx.App):
def OnInit(self):
'Create the main window and insert the custom frame'
frame = CanvasFrame()
frame.Show(True)
return True
app = App(0)
app.MainLoop()
Удивительный! Это поможет тонну. Благодаря! – bsf10