当矩形移动女巫单击鼠标时,我一直试图在另一个面板中可视化(缩放)矩形补丁内部的区域,我可以可视化矩形补丁内部的区域
问题是缩放未完全显示矩形补丁中的所有区域,或者我认为x y
当我在情节中移动鼠标时,如何始终显示矩形补丁内部的区域?
我的代码和显示的内容:
import wx
from numpy import arange, sin, pi,cos
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.patches as patches
class MainFrame(wx.Frame):
def __init__(self, parent ):
wx.Panel.__init__(self, parent,name="Main", size = (800,800))
self.Panel = Panel(self)
class Panel(wx.Panel):
def __init__(self,parent):
super().__init__(parent)
panel = wx.Panel(self)
self.canvas_panel = CanvasPanel(self)
self.zoom_panel=Zoom(parent=self)
canvas_sizer = wx.BoxSizer(wx.HORIZONTAL)
canvas_sizer.Add(self.canvas_panel,1,wx.EXPAND)
canvas_sizer.Add(self.zoom_panel,1,wx.EXPAND)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(panel)
sizer.Add(canvas_sizer)
self.SetSizerAndFit(sizer)
self.Show()
class CanvasPanel(wx.Panel):
""" Panel du graphique matplotlib """
def __init__(self, parent , size=(200,350)):
super().__init__(parent)
self.figure = Figure(figsize =(4,4))
self.canvas = FigureCanvas(self, -1, self.figure)
self.axes = self.figure.add_subplot(111)
self.Size = self.canvas.Size
self.parent = parent
t = arange(0.5, 3.0, 0.01)
s = cos(2 * pi * t)
self.axes.plot(t, s)
self.axes.get_xaxis().set_visible(False)
self.axes.get_yaxis().set_visible(False)
self.canvas.mpl_connect('button_press_event', self.on_press)
x = y = 0.02
self.rect = patches.Rectangle((x, y), 0.4,0.4,edgecolor='g', alpha=1, fill=None, label='Label')
self.axes.add_patch(self.rect)
self.axes.plot()
def on_press(self, click):
x1, y1 = click.xdata, click.ydata
x2, y2 = click.xdata, click.ydata
self.rect.set_x(x1 - 0.2) #Move the rectangle and centre it on the X click point
self.rect.set_y(y1 - 0.2) #Move the rectangle and centre it on the Y click point
self.axes.plot()
self.canvas.draw()
self.zoom_axes=[x1,x2,y1,y2]
self.parent.zoom_panel.Update(self)
class Zoom(wx.Panel):
def __init__(self,parent):
wx.Panel.__init__(self,parent,size=(200,200))
self.Show()
def Update(self,parent):
#Load axis values of the selected rectangle
zoom_axes=parent.zoom_axes
#duplicate the plot from the main panel
self.figure = Figure(figsize =(4,4))
self.canvas = FigureCanvas(self, -1, self.figure)
self.axes = self.figure.add_subplot(111)
#Apply axis of drawn rectangle to the plot
self.axes.axis(zoom_axes)
t = arange(0.5, 3.0, 0.01)
s = cos(2 * pi * t)
self.axes.plot(t, s)
self.axes.get_xaxis().set_visible(False)
self.axes.get_yaxis().set_visible(False)
self.canvas.draw()
self.Refresh()
app = wx.App()
frame = MainFrame(None).Show()
app.MainLoop()
当我单击矩形以显示缩放时出现此错误:
self.set_ylim([v[2], v[3]], emit=emit, auto=False)
UserWarning: Attempting to set identical bottom==top results
in singular transformations; automatically expanding.
bottom=0.30714285714285716, top=0.30714285714285716
谢谢
答案 0 :(得分:1)
您要为x1,x2和y1,y2发送相同的x和y值,因此实质上是在缩放到一个点而不是一个矩形。
请记住,您正在单击一个点并计算矩形,因此需要从该点计算缩放区域。见下文:
def on_press(self, click):
x1, y1 = click.xdata, click.ydata
zx1 = x1 - 0.2
zy1 = y1 - 0.2
zx2 = x1 + 0.2
zy2 = y1 + 0.2
self.rect.set_x(x1 - 0.2) #Move the rectangle and centre it on the X click point
self.rect.set_y(y1 - 0.2) #Move the rectangle and centre it on the Y click point
self.axes.plot()
self.canvas.draw()
self.zoom_axes=[zx1,zx2,zy1,zy2]
self.parent.zoom_panel.Update(self)
如果您不想计算矩形/缩放比例,请调查matplotlib
的{{1}}