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