[英]wxpython + matplotlib: autoresizing a matplotlib figure
[英]WXPython with MatPlotLib
我正在嘗試將MatPlotLib與WXPython一起使用。 我從http://www.cs.colorado.edu/~kena/classes/5448/s11/presentations/pearse.pdf找到了一個很好的示例,因為它顯示了如何使用2個面板,並且很好地解釋了如何嵌入matplotlib。 但我認為它缺少某些部分,因為圖形尚未初始化。 我該如何解決?
import wx
import numpy
import matplotlib
from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
class TestFrame(wx.Frame):
def __init__(self,parent,title):
wx.Frame.__init__(self,parent,title=title,size=(500,500))
self.sp = wx.SplitterWindow(self)
self.p1 = wx.Panel(self.sp, style=wx.SUNKEN_BORDER)
self.p2 = wx.Panel(self.sp, style=wx.SUNKEN_BORDER)
self.sp.SplitVertically(self.p1,self.p2,100)
self.statusbar = self.CreateStatusBar()
self.statusbar.SetStatusText('Oi')
class p1(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent,-1,size=(50,50))
self.figure = matplotlib.figure.Figure()
self.axes = self.figure.add_subplot(111)
t = numpy.arange(0.0,10,1.0)
s = [0,1,0,1,0,2,1,2,1,0]
self.y_max = 1.0
self.axes,plot(t,s)
self.canvas = FigureCanvas(self,-1,self.figure)
app = wx.App(redirect=False)
frame = TestFrame(None, 'Hello World!')
frame.Show()
app.MainLoop()
謝謝。
您使用matplot
了p1
類,但沒有在TestFrame
使用它。
我更改了一些名稱以使其更清晰
import wx
import numpy
import matplotlib
from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
class TestFrame(wx.Frame):
def __init__(self,parent,title):
wx.Frame.__init__(self,parent,title=title,size=(500,500))
self.sp = wx.SplitterWindow(self)
self.p1 = wx.Panel(self.sp, style=wx.SUNKEN_BORDER)
self.p2 = MatplotPanel(self.sp)
self.sp.SplitVertically(self.p1,self.p2,100)
self.statusbar = self.CreateStatusBar()
self.statusbar.SetStatusText('Oi')
class MatplotPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent,-1,size=(50,50))
self.figure = Figure()
self.axes = self.figure.add_subplot(111)
t = numpy.arange(0.0,10,1.0)
s = [0,1,0,1,0,2,1,2,1,0]
self.y_max = 1.0
self.axes.plot(t,s)
self.canvas = FigureCanvas(self,-1,self.figure)
app = wx.App(redirect=False)
frame = TestFrame(None, 'Hello World!')
frame.Show()
app.MainLoop()
另請參閱(作為示例)我對如何組合wxPython,matplotlib和Pyopengl的回答
編輯:
MatplotPanel
與NavigationToolbar
和wx.Button
改變劇情。
from matplotlib.backends.backend_wxagg import NavigationToolbar2Wx as NavigationToolbar
class MatplotPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent,-1,size=(50,50))
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.SetSizer(self.sizer)
self.figure = Figure()
self.axes = self.figure.add_subplot(111)
self.canvas = FigureCanvas(self, -1, self.figure)
self.toolbar = NavigationToolbar(self.canvas)
self.button = wx.Button(self, -1, "Change plot")
self.button.Bind(wx.EVT_BUTTON, self.changePlot)
self.sizer.Add(self.toolbar, 0, wx.EXPAND)
self.sizer.Add(self.button, 0, wx.EXPAND)
self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
self.drawSin()
self.current_draw = 'sin'
# self.drawLines()
def changePlot(self, event):
if self.current_draw == 'sin' :
self.drawLines()
self.current_draw = 'lines'
else:
self.drawSin()
self.current_draw = 'sin'
self.Layout()
def drawLines(self):
x = numpy.arange(0.0,10,1.0)
y = [0,1,0,1,0,2,1,2,1,0]
self.axes.clear()
self.axes.plot(x, y)
def drawSin(self):
x = numpy.arange(0.0,10,0.1)
y = numpy.sin(x)
self.axes.clear()
self.axes.plot(x, y)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.