pyqt5与matplotlib结合画图

go 复制代码
import numpy as np
import sys
import matplotlib
matplotlib.use('Qt5Agg')
import matplotlib.pyplot as plt
from pylab import *

mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
# 使用 matplotlib中的FigureCanvas (在使用 Qt5 Backends中 FigureCanvas继承自QtWidgets.QWidget)
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication
from PyQt5.QtCore import QTimer
import sys

from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.QtWidgets import *
from PyQt5.QtWidgets import QWidget
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt


class App(QWidget):
    def __init__(self, parent=None):
        # 父类初始化方法
        super(App, self).__init__(parent)
        self.initUI()

    def initUI(self):
        self.setWindowTitle('动态演示')
        self.setWindowIcon(QIcon('电力图标.jpg'))
        self.setWindowIcon(QIcon('2345_image_file_copy_1.jpg'))
        self.setFixedSize(1200, 700)
        self.setMinimumSize(1200, 700)
        self.setMaximumSize(1200, 700)
        # 几个QWidgets
  
        self.startBtn = QPushButton('开始')
        self.endBtn = QPushButton('结束')
        self.startBtn.clicked.connect(self.startTimer)
        self.endBtn.clicked.connect(self.endTimer)
        # 时间模块
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.showTime)
        #图像模块
        self.figure = plt.figure()#***********图像模块********************
        self.canvas = FigureCanvas(self.figure)#***********图像模块********************
        #垂直布局

        layout=QVBoxLayout()
        layout.addWidget(self.startBtn)
        layout.addWidget(self.endBtn)
        layout.addWidget( self.canvas )#***********图像模块********************
        self.setLayout(layout)



        # 数组初始化
        self.x=[]

    def showTime(self):
        shuju=np.random.random_sample()*10#返回一个[0,1)之间的浮点型随机数*10
        self.x.append(shuju)#数组更新
        ax = self.figure.add_axes([0.1, 0.1, 0.8, 0.8])
        ax.clear()
        ax.plot(self.x)
        self.canvas.draw()
    # 启动函数
    def startTimer(self):
        # 设置计时间隔并启动
        self.timer.start(1000)#每隔一秒执行一次绘图函数 showTime
        self.startBtn.setEnabled(False)#开始按钮变为禁用
        self.endBtn.setEnabled(True)#结束按钮变为可用
    def endTimer(self):
        self.timer.stop()#计时停止
        self.startBtn.setEnabled(True)#开始按钮变为可用
        self.endBtn.setEnabled(False)#结束按钮变为可用
        self.x=[]#清空数组
        


# 运行程序
if __name__ == '__main__':
    # QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
    app = QApplication(sys.argv)
    main_window = App()
    main_window.show()
    app.exec()

plt.ion()模式动态画图

pip install --upgrade PyQt5

pip install PyQt5-sip==12.11.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

go 复制代码
import matplotlib.pyplot as plt
import numpy as np
# 启动交互模式
plt.ion()
# 创建一个空的图形
fig = plt.figure()
# 循环创建数据并绘制图像
for i in range(10):
    # 创建数据
    x = np.linspace(0, 2*np.pi, 100)
    y = np.sin(x + i*0.1)
    # 清除当前图形
    plt.clf()
    # 绘制新的图像
    plt.plot(x, y)
    # 显示图像
    plt.draw()
    # 暂停一段时间,让图像更新
    plt.pause(0.1)
# 关闭交互模式
plt.ioff()
# 显示最终的图像
plt.show()
go 复制代码
#!/usr/bin/python
# -*- coding:utf-8 -*-
 
from __future__ import unicode_literals
import sys
import os
import random
import matplotlib
# Make sure that we are using QT5
matplotlib.use('Qt5Agg')
from PyQt5 import QtCore, QtWidgets
 
from numpy import arange, sin, pi
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
 
progname = os.path.basename(sys.argv[0])
progversion = "0.1"
 
 
class MyMplCanvas(FigureCanvas):
    """ 继承FigureCanvasQTAgg的基类,是一个canvas控件。"""
 
    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)    # 1行1列索引1
 
        self.compute_initial_figure()   # 画图函数
 
        FigureCanvas.__init__(self, fig)    # 调用父类的初始化函数
        self.setParent(parent)  # 设置上层控件
 
        FigureCanvas.setSizePolicy(self,
                                   QtWidgets.QSizePolicy.Expanding,
                                   QtWidgets.QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)   # 刷新布局
 
    def compute_initial_figure(self):
        """ 画图操作函数 """
        pass
 
 
class MyStaticMplCanvas(MyMplCanvas):
    """Simple canvas with a sine plot."""
 
    def compute_initial_figure(self):
        t = arange(0.0, 3.0, 0.01)
        s = sin(2*pi*t)
        self.axes.plot(t, s)
 
 
class MyDynamicMplCanvas(MyMplCanvas):
    """A canvas that updates itself every second with a new plot."""
 
    def __init__(self, *args, **kwargs):
        MyMplCanvas.__init__(self, *args, **kwargs)
        timer = QtCore.QTimer(self)
        timer.timeout.connect(self.update_figure)
        timer.start(1000)
 
    def compute_initial_figure(self):
        self.axes.plot([0, 1, 2, 3], [1, 2, 0, 4], 'r')
 
    def update_figure(self):
        # Build a list of 4 random integers between 0 and 10 (both inclusive)
        l = [random.randint(0, 10) for i in range(4)]
        self.axes.cla()     # 清空子图
        self.axes.plot([0, 1, 2, 3], l, 'r')    # 设置折线点
        self.draw()     # 重新画图
 
 
class ApplicationWindow(QtWidgets.QMainWindow):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        self.setWindowTitle("application main window")
 
        self.file_menu = QtWidgets.QMenu('&File', self)
        self.file_menu.addAction('&Quit', self.fileQuit, QtCore.Qt.CTRL + QtCore.Qt.Key_Q)
        self.menuBar().addMenu(self.file_menu)
 
        self.help_menu = QtWidgets.QMenu('&Help', self)
        self.menuBar().addSeparator()
        self.menuBar().addMenu(self.help_menu)
 
        self.help_menu.addAction('&About', self.about)
 
        self.main_widget = QtWidgets.QWidget(self)
 
        l = QtWidgets.QVBoxLayout(self.main_widget)
        sc = MyStaticMplCanvas(self.main_widget, width=5, height=4, dpi=100)
        dc = MyDynamicMplCanvas(self.main_widget, width=5, height=4, dpi=100)
        l.addWidget(sc)
        l.addWidget(dc)
 
        self.main_widget.setFocus()
        self.setCentralWidget(self.main_widget)
 
        self.statusBar().showMessage("All hail matplotlib!", 2000)
 
    def fileQuit(self):
        self.close()
 
    def closeEvent(self, ce):
        self.fileQuit()
 
    def about(self):
        QtWidgets.QMessageBox.about(self, "About",
                                    """embedding_in_qt5.py example
Copyright 2005 Florent Rougon, 2006 Darren Dale, 2015 Jens H Nielsen
This program is a simple example of a Qt5 application embedding matplotlib
canvases.
It may be used and modified with no restriction; raw copies as well as
modified versions may be distributed without limitation.
This is modified from the embedding in qt4 example to show the difference
between qt4 and qt5"""
                                )
 
 
qApp = QtWidgets.QApplication(sys.argv)
aw = ApplicationWindow()
aw.setWindowTitle("%s" % progname)
aw.show()
sys.exit(qApp.exec_())
go 复制代码
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QLabel, QPushButton, QWidget, QGroupBox, QHBoxLayout
from PyQt5.QtWidgets import QDesktopWidget
from PyQt5.QtCore import Qt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.pyplot as plt

class VisualizationApp(QMainWindow):
    def __init__(self):
        super(VisualizationApp, self).__init__()
        
		# 创建页面
        self.setWindowTitle("可视化应用")
        # 获取屏幕大小
		screen = QDesktopWidget().screenGeometry()
		screen_width, screen_height = screen.width(), screen.height()
		# 计算窗口应该出现在屏幕正中央的位置
		window_width, window_height = 900, 600
		x = (screen_width - window_width) // 2
		y = (screen_height - window_height) // 2
		# 设置窗口的位置和大小
		self.setGeometry(x, y, window_width, window_height)

        self.central_widget = QWidget(self)
        self.setCentralWidget(self.central_widget)

        self.layout = QHBoxLayout(self.central_widget)

        # 左侧 groupBox
        self.label_box = QGroupBox("可视化", self)
        self.label_box.setFixedWidth(150)  # 固定宽度
        self.layout.addWidget(self.label_box)

        # 垂直布局
        self.group_layout = QVBoxLayout(self.label_box)
        self.group_layout.setAlignment(Qt.AlignTop)  # 顶格分布

        # 饼图按钮
        self.pie_button = QPushButton("饼图", self)
        self.pie_button.clicked.connect(self.show_pie_chart)
        self.group_layout.addWidget(self.pie_button)

        # 柱状图按钮
        self.bar_button = QPushButton("柱状图", self)
        self.bar_button.clicked.connect(self.show_bar_chart)
        self.group_layout.addWidget(self.bar_button)

        # Matplotlib 白板
        self.figure, self.ax = plt.subplots()
        self.canvas = FigureCanvas(self.figure)
        self.layout.addWidget(self.canvas)

    def show_pie_chart(self):
        data = [30, 40, 20, 10]  # 示例数据
        labels = ['A', 'B', 'C', 'D']  # 示例标签
        self.ax.clear()
        self.ax.pie(data, labels=labels, autopct='%1.1f%%', startangle=90)
        self.ax.axis('equal')  # Equal aspect ratio ensures that pie is drawn as a circle.
        self.canvas.draw()

    def show_bar_chart(self):
        data = [10, 30, 50, 20]  # 示例数据
        categories = ['Category 1', 'Category 2', 'Category 3', 'Category 4']  # 示例类别
        self.ax.clear()
        self.ax.bar(categories, data)
        self.canvas.draw()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = VisualizationApp()
    window.show()
    sys.exit(app.exec_())
相关推荐
吾爱星辰2 小时前
Kotlin 处理字符串和正则表达式(二十一)
java·开发语言·jvm·正则表达式·kotlin
ChinaDragonDreamer2 小时前
Kotlin:2.0.20 的新特性
android·开发语言·kotlin
IT良2 小时前
c#增删改查 (数据操作的基础)
开发语言·c#
Kalika0-03 小时前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
_.Switch3 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
代码雕刻家3 小时前
课设实验-数据结构-单链表-文教文化用品品牌
c语言·开发语言·数据结构
一个闪现必杀技3 小时前
Python入门--函数
开发语言·python·青少年编程·pycharm
Fan_web3 小时前
jQuery——事件委托
开发语言·前端·javascript·css·jquery
龙图:会赢的3 小时前
[C语言]--编译和链接
c语言·开发语言
威桑4 小时前
记一次控件提升后,运行却不显示的Bug
qt