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



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

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)

上面是应在其中显示饼图的画布。我想我必须使用 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()

我认为这是多余的,但下面是小部件的建立。

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)

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

您通常希望避免在 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()

最新更新