PyQt 和 MatPlotLib -(嵌入式)没有 PyPlot 的饼图

PyQt And MatPlotLib - (Embedded) Pie Chart without PyPlot

我想在我的 PyQt GUI 中嵌入由分析 class 方法生成的数据饼图。使用 PyPlot 或 PyLab 我已经能够绘制图表,但只能在单独的 window.

中绘制
class MyMplCanvas(FigureCanvas):

    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)

        self.compute_initial_figure()

        FigureCanvas.__init__(self, fig)
        self.setParent(parent)

        FigureCanvas.setSizePolicy(self,
                                   QtGui.QSizePolicy.Expanding,
                                   QtGui.QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)

上面是应该显示饼图的 canvas。我想我必须在嵌入图表时使用 self.axes 参数,但我不知道。下面是我到目前为止的饼图代码:

class UsersPlatformPie(MyMplCanvas):

    def compute_initial_figure(self):

        UsersPerCountry, UsersPerPlatform = Analytics.UsersPerCountryOrPlatform()
        labels = []
        sizes = []
        print UsersPerPlatform
        for p, c in sorted(UsersPerPlatform.iteritems()):
            labels.append(p)
            sizes.append(c)
        colors = ['turquoise', 'yellowgreen', 'firebrick', 'lightsteelblue', 'royalblue']
        pylab.pie(sizes, colors = colors, labels = labels, autopct = '%1.1f%%', shadow = True)
        pylab.title('Users Per Platform')
        pylab.gca().set_aspect('1'); pylab.show()

我认为这是多余的,但下面是widget的建立。

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        ...
        self.main_widget = QtGui.QWidget(MainWindow)
        l = QtGui.QVBoxLayout(self.main_widget)
        UPP = UsersPlatformPie(self.main_widget, width=5, height=4, dpi=100)
        l.addWidget(UPP)
        self.main_widget.setFocus()
        MainWindow.setCentralWidget(self.main_widget)

我将此代码基于 this。对于这个问题的代码繁重性质,我深表歉意,但我认为至少前两部分是必要的。关于绘制饼图的新方法或将我的饼图连接到上面的 canvas 的建议将不胜感激。

您通常希望避免在 GUI 应用程序中使用 pyplot。因此,如果我正确理解 UsersPlatformPie 子类 MyMplCanvas,这意味着您可以在 self.axes.

上绘制坐标轴

所以

self.axes.pie(sizes, colors = colors, labels = labels, autopct = '%1.1f%%', shadow = True)
self.axes.set_title('Users Per Platform')
self.axes.set_aspect('1')
self.axes.figure.canvas.draw()