gpt4 book ai didi

python - WXPython 与 MatPlotLib

转载 作者:太空宇宙 更新时间:2023-11-03 18:44:17 25 4
gpt4 key购买 nike

我正在尝试将 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()

另请参阅(作为示例)我对 how to combine wxPython, matplotlib and Pyopengl 的回答

编辑:

MatplotPanel 使用 NavigationToolbarwx.Button 来更改绘图。

编辑:2022.01.03

正如 @Samuel 在评论中所说:较新的 matplotlib 需要 NavigationToolbar2WxAgg 而不是 NavigationToolbar2Wx。另请参阅 matplotlib 文档:Embedding in wx #2

# older matplotlib
#from matplotlib.backends.backend_wxagg import NavigationToolbar2Wx as NavigationToolbar

# newer matplotlib
from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg 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)
<小时/>

关于python - WXPython 与 MatPlotLib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19898115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com