【问题标题】:Embed multiple matplotlib figures in wxPython在 wxPython 中嵌入多个 matplotlib 图形
【发布时间】:2016-09-21 03:41:25
【问题描述】:

我在面板中有一个 2x2 FlexGridSizer,我想同时插入四个不同的 matplotlib 图形和它们自己的工具栏。

我已经看到许多相关链接和嵌入一个图的工作示例,但由于我是 wxPython 和 OOP 的初学者,所以在测试一些代码并尝试将它们与我的代码合并时,我感到很困惑。

这是 wx.Notebook 的页面类的一部分,我想在其中放置数字

class Pagina(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

        self.boton_descargar = wx.Button(self, -1, label=u"Descargar")
        self.boton_desconectar = wx.Button(self, -1, label=u"Desconectar")

        sizer = wx.BoxSizer(wx.VERTICAL)
        subsizer1 = wx.BoxSizer(wx.HORIZONTAL)
        subsizer2 = wx.FlexGridSizer(rows=2, cols=2)

        sizer.Add(subsizer1, 0, wx.EXPAND | wx.ALL, 0)
        sizer.Add(subsizer2, 1, wx.EXPAND | wx.ALL, 0)
        sizer.Add(self.boton_desconectar, 0, wx.ALIGN_RIGHT | wx.RIGHT, 10)
        subsizer1.Add(self.boton_descargar, 0, wx.ALL, 10)

        self.Bind(wx.EVT_BUTTON, self.onClick_descargar, self.boton_descargar)
        self.Bind(wx.EVT_BUTTON, self.onClick_desconectar, self.boton_desconectar)

        self.SetSizer(sizer)

    def onClick_descargar(self, event):
        HiloDescarga()

    def onClick_desconectar(self, event):
        pass

HiloDescarga其实是一个线程启动的,用来下载一些文本行,处理数据,绘制成这样(第四个图是一样的):

import matplotlib.pyplot as plt

line, = plt.plot(range(len(x)), x, '-', linewidth=1)
line, = plt.plot(range(len(x)), f, 'y-', linewidth=1)
plt.xlabel('x')
plt.ylabel('y')
plt.title(r'title1')
plt.grid()
plt.figure()

line, = plt.plot(range(len(y)), y, 'r-', linewidth=1)
line, = plt.plot(range(len(y)), g, 'y-', linewidth=1)
plt.xlabel('x')
plt.ylabel('y')
plt.title(r'title2')
plt.grid()
plt.figure()

line, = plt.plot(range(len(z)), z, 'g-', linewidth=1)
line, = plt.plot(range(len(z)), h, 'y-', linewidth=1)
plt.xlabel('x')
plt.ylabel('y')
plt.title(r'title3')
plt.grid()

plt.show()

所以这些数字只是在单独的窗口中弹出。如果你能给我一个 sn-p 或至少一些方向,也许是对绘图代码的一些更改,我不知道。欢迎任何帮助。

【问题讨论】:

    标签: python matplotlib wxpython


    【解决方案1】:

    您只需要遵循嵌入一个图形的示例,而是为您要创建的每个图形实例化几个成员。 这是一个简单的例子:

    import matplotlib
    matplotlib.use('WXAgg')
    from matplotlib.figure import Figure
    from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
    import wx
    
    
    class MyFrame(wx.Frame):
        def __init__(self, parent, nbFigures=4):
            super(MyFrame, self).__init__(parent)
            sizer = wx.BoxSizer(wx.VERTICAL)
            self.figs = [Figure(figsize=(2,1)) for _ in range(nbFigures)]
            self.axes = [fig.add_subplot(111) for fig in self.figs]
            self.canvases = [FigureCanvas(self, -1, fig) for fig in self.figs]
            for canvas in self.canvases:
                sizer.Add(canvas, 0, wx.ALL, 5)
            self.SetSizer(sizer)
    
    app = wx.App()
    frm = MyFrame(None)
    frm.Show()
    app.MainLoop()
    

    我已将每个图形的实例保存在数组self.figs 中,并将每个图形上的轴的每个实例保存在self.axes

    希望能让你走上正确的轨道

    【讨论】:

    • 我马上试试这个。不过我有一个疑问。为绘图任务启动一个新线程是个好主意吗?我的独立绘图脚本需要一段时间才能完成。
    • 抱歉,帮不上忙
    猜你喜欢
    • 2012-07-30
    • 2012-05-31
    • 2019-02-02
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多