【问题标题】:wxpython and multiple plt plots in multiple panelswxpython 和多个面板中的多个 plt 图
【发布时间】:2016-09-06 07:20:26
【问题描述】:

我构建了一个 wxpython gui,并试图在两个不同的面板中绘制两个不同的饼图。但是,似乎我一次只能做一个(另一个崩溃)。希望有人可能知道如何处理这个问题。我也想对条形图做同样的事情。我的代码:

self.V_Panel_Pie1 = FigurePanel(self.V_Panel7)
self.V_Panel_Pie2 = FigurePanel(self.V_Panel8)

sizer_vpanel = wx.BoxSizer(wx.VERTICAL)
sizer_vpanel.Add(self.V_Panel_Pie1,1)
self.V_Panel7.SetSizer(sizer_vpanel)

sizer_vpanel = wx.BoxSizer(wx.VERTICAL)
sizer_vpanel.Add(self.V_Panel_Pie2,1)
self.V_Panel8.SetSizer(sizer_vpanel)

self.V_Panel_Pie1.draw(a_vals, b_vals)
self.V_Panel_Pie2.draw(a_vals2, b_vals2)

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

        wx.Panel.__init__(self, parent)
        self.parent = parent
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.figure, ax = plt.subplots(figsize=(2,2))
        self.canvas = FigureCanvas(self, -1, self.figure)
        s1 = wx.BoxSizer(wx.VERTICAL)
        s1.Add(self.canvas, 0, wx.GROW)
        self.sizer.Add(s1, 5, wx.GROW)

        self.SetSizer(self.sizer)
        self.Layout()
        self.Fit()

    def draw(self, a, b):

        self.figure.clear()
        labels = 'a', 'b'
        sizes = [a,b]
        colors = ['yellowgreen', 'lightskyblue']
        explode = (0, 0.1)

        plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True, startangle=90)
        self.canvas.draw()here

【问题讨论】:

    标签: python matplotlib wxpython pie-chart


    【解决方案1】:

    看看这个minimal wxPython/matplotlib example。成功的关键是充分利用 matplotlib 面向对象的接口,而不是 pyplot 接口。避免所有调用 pyplot 的调用。

    代替:

    self.figure, _ = plt.subplot()
    

    使用:

    # from matplotlib.figure import Figure
    self.figure = Figure()
    self.axes = self.figure.add_subplot(211)
    self.axes2 = self.figure.add_subplot(212)
    
    # to draw the pies
    self.axes.pie(...)
    self.axes2.pie(...)
    

    在这种情况下不需要显式调用canvas.draw

    【讨论】:

    • 如何指定 self.axes2.pie... 进入哪个面板?
    • 您没有两个面板。 Figure 包含两个子图(在本例中为axesaxes2),它们绘制在一个FigureCanvas 上。在这种情况下,您不需要第二个面板。如果您想拥有两个单独的面板(基本上是 FigureCanvases),请使用 self.figure.add_subplot(111) 并使用 axes2 划掉所有内容。
    • 谢谢 - 我让它在两个面板中工作。对我来说,关键是你的 self.axes.pie(...)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多