python matplotlib pyqt embed pie-chart

python - matplotlib figure



PyQt y MatPlotLib-Gráfico de sectores(incrustado) sin PyPlot (1)

Quiero insertar un gráfico circular de datos producidos por un método de clase de análisis en mi GUI de PyQt. Usando PyPlot o PyLab he podido trazar el gráfico pero solo en una ventana separada.

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)

Arriba está el lienzo en el que se debe mostrar el gráfico circular. Creo que debo usar el parámetro self.axes para incrustar el gráfico, pero no sé. A continuación está el código que tengo hasta ahora para el gráfico circular:

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()

Creo que esto es superfluo, pero a continuación está el establecimiento del 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)

Estoy basando este código en esto . Me disculpo por el código de naturaleza pesada de esta pregunta, pero creo que al menos los dos primeros segmentos son necesarios. Me agradecerán mucho los consejos sobre una nueva forma de trazar el gráfico circular o de conectar mi gráfico circular al lienzo anterior.


Normalmente, desea evitar el uso de pyplot en una aplicación GUI. Entonces, si entiendo correctamente las subclases de MyMplCanvas , lo que significa que tiene los ejes para trazar disponibles como self.axes .

Por lo tanto haz

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()