matplotlib - 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_())
解决方案
如果要在 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()
推荐阅读
- java - springboot中的调度器,用于spring批处理的大数据交替
- algorithm - 您如何计算具有多个来源的 Djikstra 热图?
- swift - 如果集合视图位于 UIScrollView 中,是否会重用 UICollectionViewCell?
- angular - Angular:当列表中没有数据时如何显示消息?
- javascript - vite 构建不会在 dist 文件夹中生成 javascript 文件
- javascript - 为什么我的 TextInput 字段在不同的屏幕上表现不同。在本机反应
- c++ - 找不到由“absl”提供的具有以下任何名称的包配置文件:abslConfig.cmake absl-config.cmake
- angular - NX.Dev - 如何离线运行 create-workspace?
- java - 那时,模拟类方法没有使用 Mockito 返回预期值
- node.js - 使用 axios 发布请求和未定义的错误得到错误 400