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_()