PyQt和MatPlotLib - 没有PyPlot的{嵌入式]饼图

时间:2017-03-23 15:50:35

标签: python matplotlib pyqt embed pie-chart

我想在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)

我的代码基于this。我为这个问题的代码重要性道歉,但我认为至少前两个部分是必要的。有关绘制饼图或将我的饼图连接到上面画布的新方法的建议将非常感激。

1 个答案:

答案 0 :(得分:1)

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