Matplotlib 画布上的油炸圈饼图

Matplotlib 画布上的油炸圈饼图,matplotlib,pyqt5,Matplotlib,Pyqt5,在我的pyqt5中,我试图绘制油炸圈饼图,但我找不到我在这里犯的错误。绘制中心圆时失败。我使用了Qtwidget并将其转换为mplwidget类。我在同一个文件中添加了两个类mplnavas和MplWidget。 这是我的密码: from PyQt5 import QtCore, QtWidgets from PyQt5.QtWidgets import* from matplotlib.backends.backend_qt5agg import FigureCanvas import mat

在我的pyqt5中,我试图绘制油炸圈饼图,但我找不到我在这里犯的错误。绘制中心圆时失败。我使用了Qtwidget并将其转换为mplwidget类。我在同一个文件中添加了两个类
mplnavas
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_())

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

导入系统 从PyQt5.qtwidts导入QApplication、QVBoxLayout、QWidget 从matplotlib.backends.backend_qt5agg导入图Canvasqtagg 从matplotlib.figure导入图形 从matplotlib.patches导入圆 类MplCanvas(图CANVASQTAGG): def u uu init uu uuuu(self,parent=None,width=5,height=4,dpi=100): 超级(MplCanvas,self)。\uuuuu初始化(图(figsize=(宽度,高度),dpi=dpi)) self.axes=self.figure.add_子批次(111) self.setParent(父级) 类MplWidget(QWidget): def uuu init uuu(self,parent=None): QWidget.\uuuuu init\uuuuuuu(自我,父) self.canvas=mplnavas() 标签=[“a”、“b”、“c”、“d”] 数据=[40,10,30,20] 颜色=[“#ff9999”、“#66b3ff”、“#99ff99”、“#ffcc99”] self.canvas.axes.pie( 数据, 颜色=颜色, 标签=标签, autopct=“%1.1f%%”, startangle=90, pctdistance=0.85, ) 中心圆=圆((0,0),0.70,fc=“白色”) self.canvas.axes.add_美工(中心圆) self.canvas.axes.axis(“相等”) self.canvas.figure.tight_布局() 垂直布局=QVBoxLayout(自) 垂直布局.addWidget(self.canvas) def main(): app=QApplication(sys.argv) widget=MplWidget() widget.show() sys.exit(app.exec_()) 如果名称=“\uuuuu main\uuuuuuuu”: main()
@eyllanesc sir更新了我的帖子。这是不允许我粘贴我的完整代码第一次我得到它,先生,非常感谢您先生的快速解决。