def plotCorrelationFi(self): """ Построение графика корреляции левого и правого полушария по сегментам """ # Если выделена не однастрока (4 поля) if len(self.ui.treExportProbes.selectedIndexes()) != 4: self.statusBar().showMessage(u'Пациент не выбран') return for index in self.ui.treExportProbes.selectedItems(): # Получаем матрицы съема lMatr, rMatr = base.getMatrix(index.text(0), str(index.text(2))) # Получаем матрицу корреляции corrMtrx = MathFunc.CorrelationSegI(lMatr, rMatr) # подготавливаем холст gf.preparePlot(self.ui.qwtGraphPlot, u'Корреляция Seg(L,R)') gf.setAxis(self.ui.qwtGraphPlot) # markers (Вертикальны разделители) gf.plotVFuncMarkers(self.ui.qwtGraphPlot) # ось абцисс gf.plotAbciss(self.ui.qwtGraphPlot) # Построение графика правого полушария curve = Qwt.QwtPlotCurve(u'Корреляция Seg(L,R)') curve.attach(self.ui.qwtGraphPlot) curve.setRenderHint(Qwt.QwtPlotItem.RenderAntialiased) curve.setPen(Qt.QPen(Qt.Qt.black, 2)) curve.setData(range(0, 35), corrMtrx) # Выводим график self.ui.qwtGraphPlot.replot()
def plotMaxMin(self): ''' Постоение графика Max-min ''' # Если выделена не однастрока (4 поля) if len(self.ui.treExportProbes.selectedIndexes()) != 4: self.statusBar().showMessage(u'Пациент не выбран') return for index in self.ui.treExportProbes.selectedItems(): # Получаем матрицы съема lMatr, rMatr = base.getMatrix(index.text(0), str(index.text(2))) # Расчитываем MaxMin для каждого полушария lMaxMin = MathFunc.MaxMin(lMatr) rMaxMin = MathFunc.MaxMin(rMatr) # подготавливаем холст gf.preparePlot(self.ui.qwtGraphPlot, u'Max-Min') gf.setAxis(self.ui.qwtGraphPlot) # markers (Вертикальны разделители) gf.plotVFuncMarkers(self.ui.qwtGraphPlot) # Построение графика левого полушария curve = Qwt.QwtPlotCurve(u'Левое полушарие') curve.attach(self.ui.qwtGraphPlot) curve.setRenderHint(Qwt.QwtPlotItem.RenderAntialiased) curve.setPen(Qt.QPen(Qt.Qt.black, 2, Qt.Qt.DotLine)) curve.setData(range(0, 35), lMaxMin) # Построение графика правого полушария curve = Qwt.QwtPlotCurve(u'Правое полушарие') curve.attach(self.ui.qwtGraphPlot) curve.setRenderHint(Qwt.QwtPlotItem.RenderAntialiased) curve.setPen(Qt.QPen(Qt.Qt.black, 2)) curve.setData(range(0, 35), rMaxMin) # Выводим график self.ui.qwtGraphPlot.replot()
def plotSegment(self): """ Построение по сегментам """ cols = {'C1':Qt.Qt.black, 'C2-3':Qt.Qt.red, 'C4-5':Qt.Qt.blue, 'C6':Qt.Qt.black, 'C7-8':Qt.Qt.red, 'Th1':Qt.Qt.blue, 'Th2':Qt.Qt.black, 'Th3-4':Qt.Qt.red, 'Th5':Qt.Qt.blue, 'Th6':Qt.Qt.black, 'Th7':Qt.Qt.red, 'Th8-9':Qt.Qt.blue, 'Th10':Qt.Qt.black, 'Th11':Qt.Qt.red, 'Th12':Qt.Qt.blue, 'L1':Qt.Qt.black, 'L2':Qt.Qt.red, 'L3':Qt.Qt.blue, 'L4':Qt.Qt.black, 'L5':Qt.Qt.red, 'S1':Qt.Qt.blue, 'S2':Qt.Qt.black, 'S3-4':Qt.Qt.red, 'K-S5':Qt.Qt.blue} # Если выделена не однастрока (4 поля) if len(self.ui.treExportProbes.selectedIndexes()) != 4: return # подготавливаем холст gf.preparePlot(self.ui.qwtSegPlot, u'Сегмент', leg = 'check') gf.setAxis(self.ui.qwtSegPlot) # markers (Вертикальны разделители) gf.plotVFuncMarkers(self.ui.qwtSegPlot) # Расчёт значений for index in self.ui.treExportProbes.selectedItems(): # Получаем матрицы съема lMatr, rMatr = base.getMatrix(index.text(0), str(index.text(2))) # Получаем словарь сегментов для каждого полушария lSeg = MathFunc.Segment(lMatr) rSeg = MathFunc.Segment(rMatr) # Создаём словари curve curvL = {} curvR = {} # Строим графики по сементам for key in lSeg.keys(): # Левое полушарие curvL[key] = Qwt.QwtPlotCurve(key) curvL[key].attach(self.ui.qwtSegPlot) curvL[key].setRenderHint(Qwt.QwtPlotItem.RenderAntialiased) curvL[key].setPen(Qt.QPen(cols[key], 2, Qt.Qt.DotLine)) curvL[key].setData(range(len(lSeg[key])), lSeg[key]) self.showCurve(curvL[key], False) # Правое полушарие curvR[key] = Qwt.QwtPlotCurve(key) curvR[key].attach(self.ui.qwtSegPlot) curvR[key].setRenderHint(Qwt.QwtPlotItem.RenderAntialiased) curvR[key].setPen(Qt.QPen(cols[key], 2)) curvR[key].setData(range(len(rSeg[key])), rSeg[key]) self.showCurve(curvR[key], False) # Выводим график self.showCurve(curvL['C1'], True) self.showCurve(curvR['C1'], True) self.ui.qwtSegPlot.replot()
def plotVegetIndex(self): """ Построение вегетативного индекса (ВИ) """ if not self.ui.treExportProbes.selectedIndexes(): return srcVI = [] rezVI = [] rezDat = [] # Перебираем все выделенные item-ы for index in self.ui.treExportProbes.selectedItems(): # Получаем матрицы съема lMatr, rMatr = base.getMatrix(index.text(0), str(index.text(2))) # Расчитываем MaxMin для каждого полушария lMaxMin = MathFunc.MaxMin(lMatr) rMaxMin = MathFunc.MaxMin(rMatr) # Расчитываем ВИ и заносим его в список исходных ВИ VI = MathFunc.VegetIndex(lMaxMin, rMaxMin) srcVI.append([index.text(2), VI]) #extend # Сортируем по дате srcVI.sort() # Если выставлена группировка индексов по времени и дате if self.groupVI: # Номер группы group = 0 # Число индексов в группе div = 1 # Предыдущий обрабатываемый ВИ oldVI = 0 for i in xrange(len(srcVI)): # Если первый элемент в массиве # то добавляем его в первую группу if oldVI == 0: rezVI.append(srcVI[i][1]) rezDat.append(srcVI[i][0]) else: d1 = datetime.datetime.strptime(str(srcVI[i][0]), '%Y-%m-%d %H:%M:%S') d2 = datetime.datetime.strptime(str(oldVI[0]), '%Y-%m-%d %H:%M:%S') diff = d1 - d2 # Если разница по времени между съемами >= 7 минут (3 мин на # съем и 3 на тупняк между съемами) if diff.seconds / 60 >= 7: # Делим уже сложенные ВИ на их количество rezVI[group] = rezVI[group] / div # Формируем красивую дату с числом индексов d1 = datetime.datetime.strptime(str(rezDat[group]), '%Y-%m-%d %H:%M:%S') rezDat[group] = d1.strftime('%d.%m.%y %H:%M ') + '(' + str(div) + ')' # Добавляем текущий индекс в новую группу group = group + 1 rezVI.append(srcVI[i][1]) rezDat.append(srcVI[i][0]) div = 1 # Иначе суммируем текущий индекс с существующей суммой else: rezVI[group] = rezVI[group] + srcVI[i][1] div = div + 1 oldVI = srcVI[i] # Завершающий расчёт else: # Делим уже сложенные ВИ на их количество rezVI[group] = rezVI[group] / div # Формируем красивую дату с числом индексов d1 = datetime.datetime.strptime(str(rezDat[group]), '%Y-%m-%d %H:%M:%S') rezDat[group] = d1.strftime('%d.%m.%y %H:%M ') + '(' + str(div) + ')' # Если группировка не выставлена else: for i in xrange(len(srcVI)): rezVI.append(srcVI[i][1]) d1 = datetime.datetime.strptime(str(srcVI[i][0]), '%Y-%m-%d %H:%M:%S') rezDat.append(d1.strftime('%d.%m.%y %H:%M ')) # Расчёт среднего ВИ (отрисовывается отдельно) sum = 0 for i in xrange(len(rezVI)): sum = sum + rezVI[i] mean = sum / float(len(rezVI)) # Расчёт максимального ВИ + 20%(для масштабирования) maxVI = 0 for i in rezVI: if i > maxVI: maxVI = i if maxVI < 2.5: maxVI = 2.5 maxVI = maxVI + maxVI * 0.2 # Построение графика ВИ # подготавливаем холст gf.preparePlot(self.ui.qwtGraphPlot, u'Вегетативный индекс', leg = 'no') gf.setAxis(self.ui.qwtGraphPlot, 'index', rezDat, rezVI, maxVI) # График ВИ curve = Qwt.QwtPlotCurve(u'ВИ') curve.attach(self.ui.qwtGraphPlot) curve.setPen(Qt.QPen(Qt.Qt.black, 20)) curve.setData(range(len(rezVI)), rezVI) curve.setStyle(Qwt.Qwt.QwtPlotCurve.Sticks) # Построение границ нормы gf.plotNormBorders(self.ui.qwtGraphPlot, 2.5, 0.5, mean) # Выводим график self.ui.qwtGraphPlot.replot()