QWidget转化为matplotlib绘图窗体

PltQWidget(matplotlib绘图窗体) - 作为完整的模块(plt_qt5)使用

python 复制代码
# matplotlib canvas
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5 import NavigationToolbar2QT as NavigationToolbar

#Pyqt5
from PyQt5.QtWidgets import QSizePolicy, QWidget, QVBoxLayout

class MplCanvas(FigureCanvas):
    """
    创建一个 Matplotlib 画布类,继承自 FigureCanvasQTAgg。
    这样可以更好地封装和复用图表逻辑。
    """

    def __init__(self, width, height, pic_dpi):
        # 创建一个 Figure 对象
        self.fig = Figure((width, height), dpi=pic_dpi)
        super(MplCanvas, self).__init__(self.fig)
        FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding,
                                   QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)

class PltQWidget(QWidget):

    def __init__(self, width, height, parent, is_navigate, dpi):
        super(PltQWidget, self).__init__(parent)
        # 布局添加画布
        self.canvas = MplCanvas(width, height, dpi)
        layout = QVBoxLayout(parent)
        layout.addWidget(self.canvas)
        # 布局添加导航栏, 可选
        if is_navigate:
            toolbar = NavigationToolbar(self.canvas, self)
            toolbar.setFixedHeight(35)
            layout.addWidget(toolbar)
            layout.setSpacing(5)
        self.setLayout(layout)

    @classmethod
    def from_widget(cls,
                    widget: QWidget,
                    parent=None,
                    is_navigate=True,
                    dpi=100,
                    **kwargs):
        width = widget.width() / dpi
        height = widget.height() / dpi
        # 处理导航栏 画面布局
        if is_navigate:
            height -= 0.52
        plt_widget = cls(width, height, parent, is_navigate, dpi)
        # 复制父类所有的属性
        plt_widget.__dict__.update(widget.__dict__)
        # 添加子类特有属性
        for key, value in kwargs.items():
            setattr(plt_widget, key, value)
        return plt_widget

如何使用

  1. 正常设计,注意需要作为绘图窗体用QWidget进行设计
  2. 导入PltQWidget
  3. 初始化ui设计
  4. 将设计的窗体QWidget替换为PltQWidget
  5. 使用plt绘图(使用PltQWidget的fig: matplotlib.figure.Figure)
python 复制代码
# 导入
from plt_qt5 import PltQWidget

# 自己设计中将原来的QWidget 替换为 Plt_QWidget
class GraphFormUI(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        # 先加载ui设计(主要是获取设计中的Widget属性信息)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        ...
        # QWidget拓展到绘图 PltQWidet (self.ui.widget是设计预留的绘图窗体)
        self.ui.widget = PltQWidget.from_widget(self.ui.widget,
                                                parent=self.ui.widget)
        ...
        
     

绘图示例

python 复制代码
def plot(self):
	#清空绘图区域
	self.ui.widget.canvas.fig.clear()
	fig = self.ui.widget.canvas.fig
	
	# 使用axes绘图
	ax = fig.add_subplot(111)
	mu, sigma = 100, 15
	
	# 产生高斯分布的智商数据
	x = mu + sigma * np.random.randn(10000)
	
	# the histogram of the data 频率直方图
	ax.hist(x, 50, density=1, facecolor='g', alpha=0.75)
	ax.set_xlabel('Smarts')
	ax.set_ylabel('Probability')
	ax.set_title('Histogram of IQ')
	# 加入latex表达
	ax.text(60, .025, r'$\mu=100,\ \sigma=15$')
	ax.axis([40, 160, 0, 0.03])
	ax.grid(True)
	
	# 窗体显示
	fig.tight_layout()
	fig.canvas.draw_idle()
	QApplication.processEvents()
相关推荐
懷淰メ6 小时前
python3GUI---基于PyQt5+YOLOv8+DeepSort的智慧行车可视化系统(详细介绍)
开发语言·yolo·计算机视觉·pyqt·yolov8·deepsort·车距
:mnong9 小时前
附图报价系统设计分析2
python·pyqt·openvino
@fai1 天前
PyQt6 Graphic进阶实战:打造一个视觉恒定的可缩放矩形框
python·pyqt
佳木逢钺5 天前
PyQt界面美化系统高级工具库:打造现代化桌面应用的完整指南
python·pyqt
李昊哲小课5 天前
PySide6 记事本应用开发教程
python·pyqt·pyside
李昊哲小课6 天前
第1章-PySide6 基础认知与环境配置
python·pyqt·pyside
no_work8 天前
通过人工智能技术识别鸟类品种pyqt界面和网页版本
pyqt
浩子智控11 天前
python程序打包的文件地址处理
开发语言·python·pyqt
Jia-Hui Su13 天前
Python类型标准(Type Hints)详解
开发语言·python·numpy·pyqt·ipython·python3.11