Files
python_tools/analysis/analysis.py

177 lines
6.5 KiB
Python

#coding:utf-8
# 导入matplotlib模块并使用Qt5Agg
import typing
from PyQt5.QtCore import QObject
import matplotlib
matplotlib.use('Qt5Agg')
# 使用 matplotlib中的FigureCanvas (在使用 Qt5 Backends中 FigureCanvas继承自QtWidgets.QWidget)
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import matplotlib.pyplot as plt
import sys
import scheme_data
import numpy as np
import threading
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
# 定义一个可以嵌入到qt的figure
class QFigure(QObject):
def __init__(self,title:str) -> None:
QObject.__init__(self)
self.__figure = plt.figure(figsize=(14,7))
self.__canvas = FigureCanvas(self.__figure)
self.__ax = self.__figure.add_axes([0.1,0.1,0.8,0.8])
self.__ax.set_title(title)
def draw(self,x,y,lable:str=None,limit_max:int=None,limit_min:int=None):
line,=self.__ax.plot(x,y,)
if(lable!=None):
line.set_label(lable)
self.__ax.legend()
if(limit_max!=None):
self.__ax.axhline(y=limit_max,color='g',linestyle='--')
if(limit_min!=None):
self.__ax.axhline(y=limit_min,color='r',linestyle='--')
# start, end = self.__ax.get_ylim()
# self.__ax.yaxis.set_ticks(np.arange(start, end,(end-start)/20),minor=True)
# ticks=self.__ax.yaxis.get_ticklocs()
# self.__ax.yaxis.set_ticks(minor=True)
# self.__ax.yaxis.set_ticks(ticks)
self.__ax.grid(visible=True,which="major",axis="y")
self.__canvas.draw()
def lable(self,lablex,labley):
self.__ax.set_ylabel(labley)
self.__ax.set_xlabel(lablex)
def canvas(self):
return self.__canvas
# 定义一个任务需要的参数布局
class TParamLayout(QObject):
def __init__(self) -> None:
QObject.__init__(self)
self.__layout=QFormLayout()
self.__items=[]
def add_item(self,name:str,value:str="",tooltip:str=None):
line_edit = QLineEdit()
line_edit.setObjectName(value)
line_edit.setText(value)
line_edit_label = QLabel()
line_edit_label.setObjectName(name)
line_edit_label.setText(name)
line_edit_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
if(tooltip!=None):
line_edit_label.setToolTip(tooltip)
line_edit.setToolTip(tooltip)
self.__layout.addRow(line_edit_label,line_edit)
self.__items.append((line_edit_label,line_edit))
def item_value(self,name:str):
for i in self.__items:
if(i[0].text()==name):
return i[1].text()
return None
def values(self):
vals=[]
for i in self.__items:
vals.append((i[0].text(),i[1].text()))
return vals
def layout(self):
return self.__layout
class Analysis(QWidget):
def __init__(self,parent=None):
super(Analysis,self).__init__(parent)
self.setWindowTitle("检测数据分析")
self.__import_but = QPushButton("导入方案",self)
self.__import_but.clicked.connect(self.import_but_clicked)
self.__import_but.setGeometry(QRect(0,0,100,27))
self.__export_but = QPushButton("导出方案")
self.__export_but.clicked.connect(self.export_but_clicked)
self.__scroll=QScrollArea(self)
self.__scroll.setGeometry(0,30,1230,700)
# 设置布局
self.__layout = QFormLayout()
self.__layout.addRow(' ',self.__export_but)
self.__items=[]
def addItem(self,data,name:str,params:list()):
length=len(data)
if(length<1000):
print("data length too less.")
return
# 排序,从小到大
sort_list=np.sort(data)
dat_count=np.bincount(data)
avg=round(np.average(data))
max=sort_list[-1]
min=sort_list[0]
mid=sort_list[len(sort_list)//2]
std=round(np.std(data))
# 把众数和原始值对齐
dat_count=dat_count[min:]
dat_count_max=np.max(dat_count)
dat_zoom=length//dat_count_max
dat_count=np.multiply(dat_count,dat_zoom)
# 去掉极大值,去掉极小值,使用99.8%的数据来统计区间
limit_max_t=sort_list[-(length//1000)]
limit_min_t=sort_list[(length//1000)]
limit_max=limit_max_t+(limit_max_t-limit_min_t)//5
limit_min=limit_min_t-(limit_max_t-limit_min_t)//5
# 使用3倍标准差来统计区间
# limit_max=avg+3*std
# limit_min=avg-3*std
if(limit_min<0):
limit_min=0
figure = QFigure(name)
figure.lable("序号","数值")
tplayout=TParamLayout()
for i in params:
tplayout.add_item(i+":Max",str(max))
tplayout.add_item(i+":Min",str(min))
tplayout.add_item(i+":Avg",str(avg))
tplayout.add_item(i+":Mid",str(mid))
tplayout.add_item(i+":Std",str(std))
tplayout.add_item(i+":LimitMax",str(limit_max))
tplayout.add_item(i+":LimitMin",str(limit_min))
self.__layout.addRow(figure.canvas(),tplayout.layout())
figure.draw(range(len(data)),data,lable="原始值",limit_max=limit_max,limit_min=limit_min)
y=np.add(range(len(dat_count)),min)
figure.draw(dat_count,y,lable="权重")
self.__items.append((figure,tplayout))
# 连接的绘制的方法
def import_but_clicked(self):
# t = threading.Thread(target=self.__anslysis, args=())
# t.start()
# def __anslysis(self):
self.__import_but.setEnabled(False)
widget=QWidget()
widget.setGeometry(QRect(0,0,1200,20000))
self.titles,datas=scheme_data.datas()
for i in range(len(self.titles)):
self.addItem(datas[i],self.titles[i],[self.titles[i]])
widget.setLayout(self.__layout)
self.__scroll.setWidget(widget)
def export_but_clicked(self):
ret_limit=[]
for i,t in zip(self.__items,self.titles):
max=i[1].item_value(t+":LimitMax")
min=i[1].item_value(t+":LimitMin")
ret_limit.append((max,min))
scheme_data.export_scheme(ret_limit)
# 运行程序
if __name__ == '__main__':
app = QApplication(sys.argv)
main_window = Analysis()
main_window.show()
app.exec()