首页 > 解决方案 > mplcanvas中的甜甜圈饼图

问题描述

在此处输入图像描述

在我的 pyqt5 中,我试图绘制圆环图,但我找不到我在这里做错的地方。当我绘制中心圆时它失败了。我使用了一个 Qtwidget 并转换为一个 mplwidget 类。我在同一个文件中MplCanvas添加了两个类。MplWidget这是我的代码:

from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import*
from matplotlib.backends.backend_qt5agg import FigureCanvas
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvas 
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
from matplotlib.figure import Figure


class MplCanvas(FigureCanvasQTAgg):

    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.ax1 = fig.subplots()
        super(MplCanvas, self).__init__(fig)

class MplWidget(QWidget):
    def __init__(self, parent = None):
        QWidget.__init__(self, parent)
        self.canvas = FigureCanvas(Figure())
        vertical_layout = QVBoxLayout()
        vertical_layout.addWidget(self.canvas)
        self.canvas.axes = self.canvas.figure.add_subplot(111)
        self.canvas.axes.set_position([0.03, 0.2,0.95, 0.7])
        self.setLayout(vertical_layout)


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.Mplwidget = MplWidget(self.centralwidget)
        self.Mplwidget.setObjectName("Mplwidget")
        self.verticalLayout.addWidget(self.Mplwidget)
        MainWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        W=self.Mplwidget.canvas.axes

        W.clear()
   
        labels = ['a','b','c','d']
       
        data =[40,10,30,20]
        colors = ['#ff9999','#66b3ff','#99ff99','#ffcc99']
        
        W.pie(data,colors = colors,labels=labels, autopct='%1.1f%%', startangle=90, pctdistance=0.85)
        
        #draw circle
        centre_circle = plt.Circle((0,0),0.70,fc='white')
        fig = plt.gcf()
        fig.gca().add_artist(centre_circle)
        # Equal aspect ratio ensures that pie is drawn as a circle
        W.axis('equal')  
        plt.tight_layout()
        
        self.Mplwidget.canvas.draw()


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

标签: matplotlibpyqt5

解决方案


如果要在 Qt 中嵌入绘图,则不要使用 pyplot 而是使用画布:

import sys

from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
from matplotlib.figure import Figure
from matplotlib.patches import Circle


class MplCanvas(FigureCanvasQTAgg):
    def __init__(self, parent=None, width=5, height=4, dpi=100):
        super(MplCanvas, self).__init__(Figure(figsize=(width, height), dpi=dpi))
        self.axes = self.figure.add_subplot(111)
        self.setParent(parent)


class MplWidget(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)

        self.canvas = MplCanvas()

        labels = ["a", "b", "c", "d"]
        data = [40, 10, 30, 20]
        colors = ["#ff9999", "#66b3ff", "#99ff99", "#ffcc99"]

        self.canvas.axes.pie(
            data,
            colors=colors,
            labels=labels,
            autopct="%1.1f%%",
            startangle=90,
            pctdistance=0.85,
        )

        centre_circle = Circle((0, 0), 0.70, fc="white")
        self.canvas.axes.add_artist(centre_circle)
        self.canvas.axes.axis("equal")
        self.canvas.figure.tight_layout()

        vertical_layout = QVBoxLayout(self)
        vertical_layout.addWidget(self.canvas)


def main():
    app = QApplication(sys.argv)

    widget = MplWidget()
    widget.show()

    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

推荐阅读