добавить прямоугольный патч, который перемещается с помощью мыши на графике в wxpython - PullRequest
1 голос
/ 28 мая 2019

у меня есть первый код в wxpython

во втором коде у меня есть прямоугольник, который перемещается, когда я щелкаю мышью в любом месте

первый код:

import wx
from numpy import arange, sin, pi,cos
import numpy as np
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.widgets import RectangleSelector
from matplotlib.figure import Figure

class MainFrame(wx.Frame):
    def __init__(self, parent ):
        wx.Panel.__init__(self, parent,name="Main", size = (600,800))
        self.Top = PanelTop(self)
        self.Bottom = PanelBottom(self)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.Top, 1,wx.EXPAND)
        sizer.Add(self.Bottom, 1,wx.EXPAND)

        self.SetSizer(sizer)



class PanelTop(wx.Panel):
    def __init__(self,parent):
        wx.Panel.__init__(self,parent,size = (300,300))
        self.SetBackgroundColour('white')
        self.figure = Figure(figsize = (4,5))
        self.axes = self.figure.add_subplot(111)
        self.canvas = FigureCanvas(self,-1,self.figure)
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
        self.SetSizer(self.sizer)

        t = arange(0.5, 3.0, 0.01)
        s = cos(2 * pi * t)
        self.axes.plot(t, s)
        self.RS = RectangleSelector(self.axes,self.line_select_callback,
                                       drawtype='box', useblit=False,
                                       button=[1, 3],minspanx=1, minspany=1,
                                       spancoords='pixels',
                                       interactive=True , rectprops = dict(facecolor='None',edgecolor='green',alpha=5,fill=False))
        self.RS.to_draw.set_visible(True)
        self.RS.extents = (1,0.01,1,0.1)

    def line_select_callback(self, eclick, erelease):
        x1, y1 = eclick.xdata, eclick.ydata
        x2, y2 = erelease.xdata, erelease.ydata
        rect = self.RS.artists[0] # Rectangle artist
        slave_rect = self.Parent.Bottom.RS.artists[0] # Rectangle artist
        slave_canvas = self.Parent.Bottom.canvas

        # Force new positional values into slave rectangle
        slave_rect.set_x(x1)
        slave_rect.set_y(y1)
        slave_rect.set_width(x2-x1)
        slave_rect.set_height(y2-y1)
        slave_rect.update(dict(facecolor='None',edgecolor='green',alpha=5,fill=False))
        #Force visible in case slave rectangle has been clicked on
        slave_rect.set_visible(True)
        #Redraw slave rectangle
        slave_canvas.draw()


class PanelBottom(wx.Panel):
    def __init__(self,parent):
        wx.Panel.__init__(self, parent, size = (300,300))
        self.SetBackgroundColour('grey77')
        self.figure = Figure(figsize = (4,5))
        self.axes = self.figure.add_subplot(111)
        self.canvas = FigureCanvas(self,-1,self.figure)
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
        self.SetSizer(self.sizer)
        t = arange(0.5, 3.0, 0.01)
        s = cos(2 * pi * t)
        self.axes.plot(t, s)



        self.RS = RectangleSelector(self.axes,self.line_select_callback,
                                       drawtype='box', useblit=False,
                                       button=[1, 3],minspanx=1, minspany=1,
                                       spancoords='pixels',
                                       interactive=False, rectprops = dict(facecolor='None',edgecolor='green',alpha=5,fill=False))
        self.RS.to_draw.set_visible(True)
        self.RS.extents = (1,0,0,1)

    def line_select_callback(self, eclick, erelease):
        x1, y1 = eclick.xdata, eclick.ydata
        x2, y2 = erelease.xdata, erelease.ydata
        self.GrandParent.zoom.bottom.Update(self.zoom_axes)

app = wx.App()
frame = MainFrame(None).Show()
app.MainLoop()

второй код:

import matplotlib.pyplot as plt
import matplotlib.patches as patches

def on_press(event):
    xpress, ypress = event.xdata, event.ydata
    w = rect.get_width()
    h = rect.get_height()
    rect.set_xy((xpress-w/2, ypress-h/2))

    ax.lines = []   
    ax.axvline(xpress, c='b')
    ax.axhline(ypress, c='b')

    fig.canvas.draw() 

x = y = 1

fig = plt.figure()
ax = fig.add_subplot(111, aspect='equal')
fig.canvas.mpl_connect('button_press_event', on_press)

rect = patches.Rectangle((x,y), 0.2,0.2, alpha=1, fill=None, label='Label')
ax.add_patch(rect)

plt.show()

что мне нужно сделать, это наложить прямоугольный патч на 1-й код, и он перемещается с помощью мыши, но в то же время на 2-м графике, как будто у меня есть 2-х прямоугольный патч, но я двигаюсь одновременно и когда я двигаюсь мышь на 1-м участке прямоугольника смещается во втором за одно и то же время

я новичок в matplotlib

заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...