python - WXPython 与 MatPlotLib

标签 python numpy matplotlib wxpython

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

相关文章:

Python plot - 堆叠图像切片

python - 如何在覆盖 pandas 数据框中潜在重复项的同时重命名列

python - 如何将不同类型的列插入到 numpy 数组中?

python - 如何检查 3D 点是否在圆柱体内

python - 如何使用 matplotlib 绘制方差较大的值

Python:绘制使用 `period_range` (pandas) 创建的数据时出错

python - 好奇django是如何实现ORM查询优化的

python - 斐波那契上的 U 组合器 : how would you translate this code to python?

python - 如何有效地搜索文件中的字符串?

python - 向量与向量相乘,按标量 - numpy