PyQt5 导入Ui文件、matplotlib嵌入pyqt、matplotlib操作 实例:日志曲线生成工具

 

UI文件:

具体代码:

from PyQt5 import QtCore, QtGui, QtWidgets
import numpy as np
from Ui_mainWindowUI import Ui_Dialog
import csv
import matplotlib.pyplot as plt
import pandas as pd
import random
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas

 
 
# 注意 这里选择的父类 要和你UI文件窗体一样的类型
# 主窗口是 QMainWindow, 表单是 QWidget, 对话框是 QDialog
 
class MainWindow(QtWidgets.QDialog):
 
    def __init__(self):
        super().__init__()


        # 使用ui文件导入定义界面类
        self.ui = Ui_Dialog()
        # 初始化界面
        self.ui.setupUi(self)
        
        
        self.fileName = 'E:\\work\\logCSV\\sin.csv'
        self.fileName2 = 'E:\\work\\logCSV\\cos.csv'
 
        self.ui.btn_generate_csv.clicked.connect(self.handle_generate_csv)
        self.ui.btn_open_csv.clicked.connect(self.handle_open_csv)
        self.ui.btn_generate_curve.clicked.connect(self.handle_generate_curve)
        self.ui.btn_clear.clicked.connect(self.handle_clear)
        self.ui.btn_clear_ps.clicked.connect(self.handle_clear_ps)
        self.ui.btn_clear_bs.clicked.connect(self.handle_clear_bs)
        self.ui.btn_clear_speed.clicked.connect(self.handle_clear_rdb)
        self.ui.btn_clear_tem.clicked.connect(self.handle_clear_tem)
        self.ui.btn_ps.clicked.connect(self.handle_ps)
        self.ui.btn_bs.clicked.connect(self.handle_bs)
        self.ui.btn_rdb.clicked.connect(self.handle_rdb)
        self.ui.btn_tem.clicked.connect(self.handle_tem)
        

  
        #Matplotlib 嵌入 pyQT5核心代码
        # 创建Matplotlib图形
        self.figure = plt.figure()
        self.canvas = FigureCanvas(self.figure)

        # 创建一个垂直布局并将Matplotlib图形添加到其中
        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self.canvas)
        self.ui.widget.setLayout(layout)



    
    #打开csv文件
    def handle_open_csv(self):
        fileName, _ = QtWidgets.QFileDialog.getOpenFileName(self, 'Open file', '')
        self.fileName = fileName
        print(self.fileName)


    

    #生成sin曲线文件   利用 pandas 库
    def handle_generate_csv(self):

        # logPath = 'E:\\work\\logCSV\\sin.csv'
        logPath = 'E:\\work\\logCSV\\cos.csv'
        # logPath = 'E:\\work\\logCSV\\test.csv'

        rand_num = random.randint(1, 100) #生成随机数

        # np.linspace(start = 0, stop = 100, num = 5)
        # 代码生成 NumPy 数组 (ndarray 对象),结果如下:array([ 0., 25., 50., 75., 100.])
        # 通过定义均匀间隔创建数值序列。其实,需要指定间隔起始点、终止端,以及指定分隔值总数(包括起始点和终止点);最终函数返回间隔类均匀分布的数值序列
        x=np.linspace(0,8*np.pi,8*16) #8/2=4 4个完整的正弦波波形   8*16代表一共生成的点数量

        # y=43+43*np.sin(x)  #调整43这个值可以调整波峰值
        y=43+43*np.cos(x)  #调整43这个值可以调整波峰值

        y = pd.DataFrame(y,x) #转换成DataFrame一种表格型数据结构


        y.to_csv(logPath) #保存为csv文件

        # 如何用python中pandas模块在csv文件中添加表头,names后面是你想要设置的表头
        df = pd.read_csv(logPath,header=None,names=["tag","all"])

        df.to_csv(logPath,index=False) # index 是否自动生成行索引
        # df.to_csv(logPath,index=True) # index 是否自动生成行索引




    #生成曲线
    def handle_generate_curve(self):

        print(self.fileName)

        data = pd.read_csv(self.fileName)
        data2 = pd.read_csv(self.fileName2)


        #获取表格数据的一些方法

        # #获取行数据
        # xdata = data.loc[1]
        # xdata = data.loc[3:5]
        # xdata = data.loc[3:]
        # print(xdata)


        # #获取单元格数据
        # xdata = data.loc[1,'all']
        # print(xdata)


        # #获取列数据1
        # xdata = data.loc[:, 'tag']
        # ydata = data.loc[:, 'all']
        # ydata2 = data2.loc[:, 'all']
        # print(xdata)


        # #获取第二行开始的列数据1
        # xdata = data.loc[2:, 'tag']
        # ydata = data.loc[2:, 'all']
        # ydata2 = data2.loc[2:, 'all']
        # print(xdata)


        # #获取列数据3
        # xdata = data['tag']
        # ydata = data['all']
        # ydata2 = data2['all']
        # print(xdata)


        # #获取两列数据,注意括号
        # data[['team', 'Q1']] # 获取两列数据,注意括号
        # data.loc[:, ['team', 'Q1']] # 和上边效果一样


 
        #增加一列 Pandas 增加一列非常方便,就是新定义一个字典的键值一样。
        # data['one'] = 1 # 增加一个固定值的列
        # data['two'] = data['tag'] # 增加一个固定值的列
        # data['three'] = data['all'] # 增加一个固定值的列
        # data['total'] = data['all'] + data['tag'] # 增加总成绩列
        # # 指定一些列相加增加一个新列
        # data['total2'] = data.loc[:,'tag':'all'].apply(lambda x:sum(x), axis=1)
        # data['total3'] = data.sum(axis=1) # 可以把所有为数字的列相加
        # data['avg'] = data['total']/4 # 增加平均成绩列
        # print(data)




        # #获取列数据  1
        # xdata = data['tag']
        # ydata = data['all']
        # ydata2 = data2['all']
   
        # # 去除第一个无效数据
        # xdata = xdata.drop(xdata.index[0])
        # ydata = ydata.drop(ydata.index[0])
        # ydata2 = ydata2.drop(ydata.index[0])



        # #获取第二行开始的列数据1
        xdata = data.loc[1:, 'tag']
        ydata = data.loc[1:, 'all']
        ydata2 = data2.loc[1:, 'all']



        # 创建一个Matplotlib子图
        self.ax = self.figure.add_subplot(221) #两行两列 第一个
        self.ax.set_title('yali  curve')
        # 画图
        self.ax.plot(xdata, ydata, color='blue',  linewidth=1.2, mec='r', mfc='w', label=u'ps1')  # color可自定义折线颜色,marker可自定义点形状,label为折线标注
        self.ax.plot(xdata, ydata2, color='red',  linewidth=1.2, mec='r', mfc='w', label=u'ps2')  # color可自定义折线颜色,marker可自定义点形状,label为折线标注
        self.ax.legend(loc='upper right')  #设置标注位置
        self.ax.set_xlabel(u'count')
        self.ax.set_ylabel(u'value')


        
        # 创建一个Matplotlib子图
        self.ax2 = self.figure.add_subplot(222)
        self.ax2.set_title('qitiyali  curve')
        # 画图
        self.ax2.plot(xdata, ydata, color='blue',  linewidth=1.2, mec='r', mfc='w', label=u'bs')  # color可自定义折线颜色,marker可自定义点形状,label为折线标注
        self.ax2.legend(loc='upper right')
        self.ax2.set_xlabel(u'count')
        self.ax2.set_ylabel(u'value')




        # 创建一个Matplotlib子图
        self.ax3 = self.figure.add_subplot(223)
        self.ax3.set_title('rdb speed  curve')
        # 画图
        self.ax3.plot(xdata, ydata, color='blue',  linewidth=1.2, mec='r', mfc='w', label=u'curve')  # color可自定义折线颜色,marker可自定义点形状,label为折线标注
        self.ax3.legend(loc='upper left')
        self.ax3.set_xlabel(u'count')
        self.ax3.set_ylabel(u'value')



        # 创建一个Matplotlib子图
        self.ax4 = self.figure.add_subplot(224)
        self.ax4.set_title('chamber tem  curve')
        # 画图
        self.ax4.plot(xdata, ydata, color='blue',  linewidth=1.2, mec='r', mfc='w', label=u'curve')  # color可自定义折线颜色,marker可自定义点形状,label为折线标注
        self.ax4.legend(loc='upper left')
        self.ax4.set_xlabel(u'count')
        self.ax4.set_ylabel(u'tem')

        # # 保存图片
        plt.savefig('E:\\work\\logCSV\\data_rate.png') 

        # 更新Matplotlib图形
        self.canvas.draw()
    


    




    def handle_clear(self):
        self.ax.clear()
        self.ax2.clear()
        self.ax3.clear()
        self.ax4.clear()
        self.canvas.draw()# 更新Matplotlib图形


    def handle_clear_ps(self):
        self.ax.clear()
        self.canvas.draw()# 更新Matplotlib图形

    def handle_clear_bs(self):
        self.ax2.clear()
        self.canvas.draw()# 更新Matplotlib图形

    def handle_clear_rdb(self): 
        self.ax3.clear()
        self.canvas.draw()# 更新Matplotlib图形

    def handle_clear_tem(self):
        self.ax4.clear()
        self.canvas.draw()# 更新Matplotlib图形




    def handle_ps(self):
        data = pd.read_csv(self.fileName)
        data2 = pd.read_csv(self.fileName2)

        xdata = data.loc[:, 'tag']
        ydata = data.loc[:, 'all']
        ydata2 = data2.loc[:, 'all']
        # 去除第一个元素
        xdata = xdata.drop(xdata.index[0])
        ydata = ydata.drop(ydata.index[0])
        ydata2 = ydata2.drop(ydata.index[0])

        self.ax.set_title('yali  curve')

        # 画图
        self.ax.plot(xdata, ydata, color='blue',  linewidth=1.2, mec='r', mfc='w', label=u'ps1')  # color可自定义折线颜色,marker可自定义点形状,label为折线标注
        self.ax.plot(xdata, ydata2, color='red',  linewidth=1.2, mec='r', mfc='w', label=u'ps2')  # color可自定义折线颜色,marker可自定义点形状,label为折线标注

        self.ax.legend(loc='upper right')

        self.ax.set_xlabel(u'count')
        self.ax.set_ylabel(u'value')

        self.canvas.draw()# 更新Matplotlib图形


        

    def handle_bs(self):
        data = pd.read_csv(self.fileName)
        xdata = data.loc[:, 'tag']
        ydata = data.loc[:, 'all']
        # 去除第一个元素
        xdata = xdata.drop(xdata.index[0])
        ydata = ydata.drop(ydata.index[0])

        self.ax2.set_title('qitiyali  curve')

        # 画图
        self.ax2.plot(xdata, ydata, color='blue',  linewidth=1.2, mec='r', mfc='w', label=u'bs')  # color可自定义折线颜色,marker可自定义点形状,label为折线标注
        
        self.ax2.legend(loc='upper right')

        self.ax2.set_xlabel(u'count')
        self.ax2.set_ylabel(u'value')

        self.canvas.draw()# 更新Matplotlib图形
        

    def handle_rdb(self):
        data = pd.read_csv(self.fileName)

        xdata = data.loc[:, 'tag']
        ydata = data.loc[:, 'all']
  
        # 去除第一个元素
        xdata = xdata.drop(xdata.index[0])
        ydata = ydata.drop(ydata.index[0])

     
        self.ax3.set_title('rdb speed  curve')

        # 画图
        self.ax3.plot(xdata, ydata, color='blue',  linewidth=1.2, mec='r', mfc='w', label=u'curve')  # color可自定义折线颜色,marker可自定义点形状,label为折线标注
        
        self.ax3.legend(loc='upper right')

        self.ax3.set_xlabel(u'count')
        self.ax3.set_ylabel(u'value')

        self.canvas.draw()# 更新Matplotlib图形



    def handle_tem(self):
        data = pd.read_csv(self.fileName)

        xdata = data.loc[:, 'tag']
        ydata = data.loc[:, 'all']
  
        # 去除第一个元素
        xdata = xdata.drop(xdata.index[0])
        ydata = ydata.drop(ydata.index[0])

     
        self.ax4.set_title('chamber tem  curve')

        # 画图
        self.ax4.plot(xdata, ydata, color='blue',  linewidth=1.2, mec='r', mfc='w', label=u'curve')  # color可自定义折线颜色,marker可自定义点形状,label为折线标注
        
        self.ax4.legend(loc='upper right')

        self.ax4.set_xlabel(u'count')
        self.ax4.set_ylabel(u'tem')

        self.canvas.draw()# 更新Matplotlib图形



 
if __name__ == '__main__':
 
    app = QtWidgets.QApplication([])
    mainw = MainWindow()
    mainw.setWindowTitle("日志曲线生成工具")
    mainw.show()
    app.exec_()

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PyQt5嵌入Matplotlib可以通过以下步骤实现: 1. 导入所需的模块: ```python from PyQt5 import QtWidgets from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure ``` 2. 创建一个继承自QtWidgets.QMainWindow的主窗口类: ```python class MainWindow(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("PyQt5嵌入Matplotlib") self.setGeometry(100, 100, 800, 600) ``` 3. 在主窗口类的初始化方法中创建一个Matplotlib的画布对象,并将其添加到主窗口中: ```python class MainWindow(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("PyQt5嵌入Matplotlib") self.setGeometry(100, 100, 800, 600) # 创建Matplotlib的画布对象 self.canvas = FigureCanvas(Figure()) # 将画布添加到主窗口中 self.setCentralWidget(self.canvas) ``` 4. 在主窗口类中添加一个绘图方法,用于在Matplotlib画布上绘制图形: ```python class MainWindow(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("PyQt5嵌入Matplotlib") self.setGeometry(100, 100, 800, 600) # 创建Matplotlib的画布对象 self.canvas = FigureCanvas(Figure()) # 将画布添加到主窗口中 self.setCentralWidget(self.canvas) def plot(self): # 在画布上绘制图形 fig = self.canvas.figure ax = fig.add_subplot(111) ax.plot([1, 2, 3, 4, 5], [1, 4, 9, 16, 25]) # 更新画布 self.canvas.draw() ``` 5. 在主窗口类中重写showEvent方法,用于在窗口显示时调用绘图方法: ```python class MainWindow(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("PyQt5嵌入Matplotlib") self.setGeometry(100, 100, 800, 600) # 创建Matplotlib的画布对象 self.canvas = FigureCanvas(Figure()) # 将画布添加到主窗口中 self.setCentralWidget(self.canvas) def plot(self): # 在画布上绘制图形 fig = self.canvas.figure ax = fig.add_subplot(111) ax.plot([1, 2, 3, 4, 5], [1, 4, 9, 16, 25]) # 更新画布 self.canvas.draw() def showEvent(self, event): # 在窗口显示时调用绘图方法 self.plot() ``` 6. 创建一个应用程序对象,并显示主窗口: ```python import sys app = QtWidgets.QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) ``` 这样就可以在PyQt5UI嵌入Matplotlib了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高亚奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值