Hall Measurement main.pyw

本文介绍了一个使用PyQt5和Matplotlib实现的数据展示和拟合平台,该平台可以加载数据文件,显示选定坐标的数据表格,并进行平台区域检测及线性拟合。文章详细展示了如何利用PyQt5构建GUI界面,以及如何使用Matplotlib绘制原始数据及其拟合曲线。
  1 import os
  2 import sys
  3 import math
  4 from PyQt5.QtCore import *
  5 from PyQt5.QtWidgets import *
  6 import numpy as np
  7 import matplotlib
  8 matplotlib.use('Qt5Agg')
  9 
 10 from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
 11 from matplotlib.figure import Figure
 12 
 13 importpath = '/Users/zhangruoxi/Documents/A1-代码/Python/Data_Processing/Hall_Measurement'
 14 os.chdir(importpath)
 15 import Correction as coc
 16 
 17 datapath = '/Volumes/RUOXI/00-DataTransfer'
 18 
 19 class DataTable(QDialog):
 20     def __init__(self, parent=None, names=[], x_data=[], y_data=[]):
 21         super(DataTable, self).__init__(parent)
 22         self.setAttribute(Qt.WA_DeleteOnClose)
 23 
 24         self.setFixedSize(400, 600)
 25         self.table = QTableWidget(len(x_data),2)
 26         self.table.setHorizontalHeaderLabels(names)
 27         temp = 0
 28         for data in x_data:
 29             newItem = QTableWidgetItem('%.8e'%data)
 30             self.table.setItem(temp,0,newItem)
 31             temp+=1
 32         temp = 0
 33         for data in y_data:
 34             newItem = QTableWidgetItem('%.8e'%data)
 35             self.table.setItem(temp,1,newItem)
 36             temp+=1
 37         layout=QHBoxLayout()
 38         layout.addWidget(self.table)
 39         self.setLayout(layout)
 40 
 41 class PlatueTable(QDialog):
 42     def __init__(self, parent=None, names=(), data=()):
 43         super(PlatueTable, self).__init__(parent)
 44         self.setAttribute(Qt.WA_DeleteOnClose)
 45 
 46         self.setFixedSize(800, 600)
 47         self.table = QTableWidget(len(data), 5)
 48         self.table.setHorizontalHeaderLabels(names)
 49         temp = 0
 50         for tempdata in data:
 51             newItem = []
 52             [newItem.append(QTableWidgetItem('%.8e'%tempdata[x])) for x in range(0,5)]
 53             newItem[3] = QTableWidgetItem('%d'%tempdata[3])
 54             temp1 = 0
 55             for Item in newItem:
 56                 self.table.setItem(temp,temp1,Item)
 57                 temp1+=1
 58             temp+=1
 59         layout=QHBoxLayout()
 60         layout.addWidget(self.table)
 61         self.setLayout(layout)
 62 
 63 class Figure_Canvas(FigureCanvas):
 64     def __init__(self, parent=None, width=8, height=6, dpi=100):
 65         fig = Figure(figsize=(width,height), dpi=100)
 66         super(Figure_Canvas, self).__init__(fig)
 67         self.setAttribute(Qt.WA_DeleteOnClose)
 68 
 69         self.setParent(parent)
 70         self.axes = fig.add_subplot(111)
 71 
 72     def Plotdotline(self, x_point, y_data, fitcurve):
 73         x_point = [float(x_point[x]) for x in range(0,len(x_point))]
 74         y_data = [float(y_data[x]) for x in range(0,len(y_data))]
 75         self.axes.plot(x_point,y_data,'bo')
 76         y_fit = []
 77         if fitcurve != []:
 78             for point in x_point:
 79                 y_fit.append(float(fitcurve[0])*point+float(fitcurve[1]))
 80             self.axes.plot(x_point,y_fit,'r-')
 81 
 82 class FigurePlot(QDialog):
 83     def __init__(self, parent=None, x_data=[], y_data=[], fitcurve=[0,0], title=''):
 84         super(FigurePlot, self).__init__(parent)
 85         self.setAttribute(Qt.WA_DeleteOnClose)
 86 
 87         self.graphicview = QGraphicsView()
 88         dr = Figure_Canvas()
 89         dr.Plotdotline(x_data, y_data, fitcurve)
 90         graphicscene = QGraphicsScene()
 91         graphicscene.addWidget(dr)
 92         self.graphicview.setScene(graphicscene)
 93         self.graphicview.setWindowTitle(title)
 94         self.graphicview.show()
 95         self.graphicview.setFixedSize(800,600)
 96 
 97 class Form(QDialog):
 98     def __init__(self, path="" , parent=None):
 99         super(Form, self).__init__(parent)
100         self.setAttribute(Qt.WA_DeleteOnClose)
101 
102         self.pathLabel = QLabel('Please Change File Path...')
103         self.path  = datapath
104         self.pathbutton = QPushButton('Change Path')
105 
106         fileLabel = QLabel("Choose A File:")
107         self.files = []
108         self.filechoice = QComboBox()
109 
110         self.datanames = []
111         xcoordinateLabel = QLabel('Coordinate x:')
112         self.xcoordinate = QComboBox()
113 
114         ycoordinateLabel = QLabel('Coordinate y:')
115         self.ycoordinate = QComboBox()
116 
117         self.showdata = QPushButton("&Show")
118 
119         spanLabel = QLabel('Platue Span:')
120         self.span = QSpinBox()
121         self.span.setRange(5,1000000)
122         self.span.setValue(20)
123 
124         toleranceLabel = QLabel('Tolerance:')
125         self.tolerance = QDoubleSpinBox()
126         self.tolerance.setRange(0.00000001,0.1)
127         self.tolerance.setValue(0.0001)
128         self.tolerance.setDecimals(8)
129 
130         platueminLable = QLabel('Min Platue:')
131         self.platuemin = QLineEdit('5/2')
132         self.platuemin.selectAll()
133 
134         self.calcplatue = QPushButton('Platue')
135 
136         self.fitting = QPushButton('Fit')
137         self.plotfitting = QPushButton('Plot')
138         self.clearfitting = QPushButton('Clear')
139         self.fittingresult = QTextBrowser()
140 
141         layout = QGridLayout()
142         layout.addWidget(self.pathLabel, 0, 0, 1, 2)
143         layout.addWidget(self.pathbutton, 0, 2)
144         layout.addWidget(fileLabel, 1, 0)
145         layout.addWidget(self.filechoice, 2, 0, 1, 3)
146         layout.addWidget(xcoordinateLabel, 3, 0)
147         layout.addWidget(ycoordinateLabel, 3, 1)
148         layout.addWidget(self.xcoordinate, 4, 0)
149         layout.addWidget(self.ycoordinate, 4, 1)
150         layout.addWidget(self.showdata, 4, 2)
151         layout.addWidget(spanLabel, 5, 0)
152         layout.addWidget(toleranceLabel, 5, 1)
153         layout.addWidget(self.span, 6, 0)
154         layout.addWidget(self.tolerance, 6, 1)
155         layout.addWidget(self.calcplatue, 6, 2)
156         layout.addWidget(platueminLable, 7, 0)
157         layout.addWidget(self.platuemin, 7, 1, 1, 2)
158 
159         fittinglayout = QVBoxLayout()
160         fittinglayout.addWidget(self.fittingresult)
161 
162         layout.addWidget(self.fitting, 8, 0)
163         layout.addWidget(self.plotfitting, 8, 1)
164         layout.addWidget(self.clearfitting, 8, 2)
165         layout.addLayout(fittinglayout, 9, 0, 1, 3)
166         self.setLayout(layout)
167         self.setWindowTitle('Platue Fitting v1.0')
168 
169         self.pathbutton.clicked.connect(self.changeFileDirectory)
170 
171         self.filechoice.currentIndexChanged.connect(self.loadDataNames)
172 
173         self.showdata.clicked.connect(self.showData)
174 
175         self.calcplatue.clicked.connect(self.calcPlatue)
176 
177         self.fitting.clicked.connect(self.Fit)
178         
179         self.clearfitting.clicked.connect(self.Clear)
180 
181         self.plotfitting.clicked.connect(self.Plot)
182     
183     def changeFileDirectory(self):
184         try:
185             dialog = QFileDialog(self, 'Choose a path: ',self.path, '.')
186             dialog.setFileMode(QFileDialog.DirectoryOnly)
187             if dialog.exec() == QDialog.Accepted:
188                 self.path = dialog.selectedFiles()[0]
189             self.pathLabel.setText("File Directory Imported")
190             self.files = coc.GetDataFiles(self.path)
191             self.filechoice.clear()
192             self.filechoice.addItems(self.files)
193             self.loadDataNames()
194         except Exception as e:
195             self.pathLabel.setText("File Directory Error: %s" %e)
196 
197     def loadDataNames(self):
198         try:
199             self.xcoordinate.clear()
200             self.ycoordinate.clear()
201             self.datanames = coc.GetDataPosition(self.files[self.filechoice.currentIndex()])[2]
202             self.xcoordinate.addItems(self.datanames)
203             self.ycoordinate.addItems(self.datanames)
204         except Exception as e:
205             self.pathLabel.setText("Data Name Error: %s" %e)
206 
207     def showData(self):
208         try:
209             dataset = coc.GetDataArray(self.files[self.filechoice.currentIndex()])
210             x_data = dataset[self.datanames[self.xcoordinate.currentIndex()]].tolist()
211             y_data = dataset[self.datanames[self.ycoordinate.currentIndex()]].tolist()
212             names = [self.datanames[self.xcoordinate.currentIndex()],self.datanames[self.ycoordinate.currentIndex()]]
213             Table = DataTable(parent=self, names=names, x_data=x_data, y_data=y_data)
214             Table.show()
215         except Exception as e:
216             self.pathLabel.setText("Show Data Error: %s" %e)
217 
218     def calcPlatue(self):
219         try:
220             dataset = coc.GetDataArray(self.files[self.filechoice.currentIndex()])
221             x_data = dataset[self.datanames[self.xcoordinate.currentIndex()]].tolist()
222             y_data = dataset[self.datanames[self.ycoordinate.currentIndex()]].tolist()
223             names = (self.datanames[self.xcoordinate.currentIndex()],self.datanames[self.ycoordinate.currentIndex()], 'StdVariance','Span','Platue')
224             platuedata = coc.GetPlatue(x_data, y_data, self.span.value(), self.tolerance.value(), eval(self.platuemin.text()))
225             Table = PlatueTable(parent=self, names=names, data=platuedata)
226             Table.show()
227         except Exception as e:
228             self.pathLabel.setText("Platue Calc Error: %s" %e)
229             
230     def Fit(self):
231         try:
232             dataset = coc.GetDataArray(self.files[self.filechoice.currentIndex()])
233             x_data = dataset[self.datanames[self.xcoordinate.currentIndex()]].tolist()
234             y_data = dataset[self.datanames[self.ycoordinate.currentIndex()]].tolist()
235             rawfit = np.polyfit(x_data, y_data, 1)
236             rawfitstr = "%s * x + %s"%(rawfit[0],rawfit[1])
237             self.fittingresult.append("Rawfitting:\n%s"%rawfitstr)
238             platuedata = coc.GetPlatue(x_data, y_data, self.span.value(), self.tolerance.value(), eval(self.platuemin.text()))
239             x_platue = [platuedata[x][1] for x in range(0,len(platuedata))]
240             y_platue = [platuedata[x][4] for x in range(0,len(platuedata))]
241             platuefit = np.polyfit(x_platue, y_platue, 1)
242             platuefitstr = "%s * x + %s"%(platuefit[0],platuefit[1])
243             self.fittingresult.append("Platuefitting:\n%s"%platuefitstr)
244         except Exception as e:
245             self.fittingresult.append("Fitting Error: %s" %e)
246 
247     def Clear(self):
248         self.fittingresult.clear()
249 
250     def Plot(self):
251         try:
252             dataset = coc.GetDataArray(self.files[self.filechoice.currentIndex()])
253             x_data = dataset[self.datanames[self.xcoordinate.currentIndex()]].tolist()
254             y_data = dataset[self.datanames[self.ycoordinate.currentIndex()]].tolist()
255             rawfit = np.polyfit(x_data, y_data, 1)
256             rawfitstr = "%s * x + %s"%(rawfit[0],rawfit[1])
257             self.fittingresult.append("Rawfitting:\n%s"%rawfitstr)
258             fig1 = FigurePlot(self, x_data, y_data, rawfit, 'Raw Data Fitting')
259             platuedata = coc.GetPlatue(x_data, y_data, self.span.value(), self.tolerance.value(), eval(self.platuemin.text()))
260             x_platue = [platuedata[x][0] for x in range(0,len(platuedata))]
261             y_platue = [platuedata[x][1] for x in range(0,len(platuedata))]
262             platuefit = np.polyfit(x_platue, y_platue, 1)
263             platuefitstr = "%s * x + %s"%(platuefit[0],platuefit[1])
264             self.fittingresult.append("Platuefitting:\n%s"%platuefitstr)
265             fig2 = FigurePlot(self, x_platue, y_platue, [], 'Platue Data')
266         except Exception as e:
267             self.fittingresult.append("Fitting Error: %s" %e)
268 
269 app = QApplication(sys.argv)
270 form = Form()
271 form.show()
272 app.exec_()

 

转载于:https://www.cnblogs.com/phyzrx/p/7475164.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值