Как построить из нескольких файлов и показать данные в виде слайд-шоу на одном рисунке - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь нанести данные из нескольких файлов и показать их в виде слайд-шоу. Я использовал многократную загрузку файлов и сохранял имена файлов в массиве. У меня есть Combobox, чтобы выбрать загруженные файлы для построения. Каждый файл варьируется по номерам столбцов. Я хочу показать номера столбцов для каждого файла в Combobox. Если я выберу два файла для построения графика, столбцы для этих двух файлов должны быть показаны в Combobox. Затем я хочу выбрать столбец для каждого файла для построения графика, чтобы данные, связанные с выбранным столбцом в двух файлах, можно было представить на одном рисунке в PyQt5 в виде слайд-шоу.

Например: у меня есть текстовый файл 'f1.txt', содержащий данные в виде:

-0.3179    0-.431740       0.0108093       -0.0000219      0.0000008       5.0000539
0.460      -0.0009670      -0.0131101       0.0324327      -0.0001963       0.0000032       5.0004859
0.480      -0.0016334      -0.0221107       0.0540626      -0.0005492       0.0000080       5.0013509
0.500      -0.0023167      -0.0313161       0.0756992      -0.0010846       0.0000152       5.0026488
----
17000.000   -1.6828437       0.7110020      41.0121536     -51.9806252     -35.5798378      25.40506

Другой файл 'f2.txt', имеющий данные как:

   -0.02       -0.02002       -0.00537       -0.01416
    0.00       -0.02002       -0.00537       -0.01416
    0.02       -0.02002       -0.00049       -0.00928
    0.04       -0.02002       -0.00537       -0.01416
    ---
    17499.98    1.95898        0.71338        9.99951

'f1.txt' и 'f2.txt' содержат 7 и 4 столбца соответственно. Я хочу показать номера столбцов для каждого файла в выпадающем списке. Если я выберу столбец 2 в Combobox для f1.txt и столбец 3 для f2.txt, то данные из f1.txt для столбца 2[ 0-.431740 ,-0.0009670,-0.0016334,-0.0023167 ,... -1.6828437] и данные из f2.txt для столбца3 [-0.00537 ,-0.00537,-0.00049, -0.00537,... 0.71338] будут построены так, чтобы два данных может быть визуализирован в виде одной фигуры в виде слайд-шоу.

То, что я пробовал, это:

from asyncore import loop
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5 import *
from PyQt5.QtCore import QEventLoop, QTimer
from PyQt5.QtWidgets import *
from PyQt5.uic import loadUi
from matplotlib.backends.backend_qt5agg import (NavigationToolbar2QT as NavigationToolbar)
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import style
import random
import matplotlib.animation as animation
import os
import shutil
import time

class MatplotlibWidget(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        loadUi("graphgenerate.ui", self)
        self.setWindowTitle("Graph Plotting App")
        self.upload_btn.clicked.connect(self.upload_File)
        self.playbutton.clicked.connect(self.selectFile)     
        self.addToolBar(NavigationToolbar(self.MplWidget.canvas, self))

    def upload_File(self):           
        fname=[]
        file_dialog = QFileDialog()
        file_dialog.setFileMode(QFileDialog.ExistingFiles)
        file_dialog.setOption(QFileDialog.DontUseNativeDialog, True)
        file_view = file_dialog.findChild(QListView, 'listView')
        # to make it possible to select multiple directories:
        if file_view:
            file_view.setSelectionMode(QAbstractItemView.MultiSelection)
        f_tree_view = file_dialog.findChild(QTreeView)
        if f_tree_view:
            f_tree_view.setSelectionMode(QAbstractItemView.MultiSelection)
        if file_dialog.exec():
            paths = file_dialog.selectedFiles()
            for p in paths:
                sp = os.path.split(p)[1]
                fname.append(sp)
                shutil.copy(p,"Files")
        self.comboBox.addItems(fname)

    def selectFile(self):

            QtWidgets.QMessageBox.warning(QtWidgets.QMessageBox(), 'Error', 'Please Select File and Column to plot')
            s = self.comboBox.activated[str].connect(self.selectColumn)

    def selectColumn(self,i):

        path = "Files" + "\\" + i
        f1 = open(path, 'r')
        global data,m,n
        data = np.genfromtxt(f1)
        m = np.size(data, 0)
        n = np.size(data, 1)
        col = []
        for k in range(1,n):
            col.append("Column " + str(k))
        self.column_Combobox.clear()
        self.column_Combobox.addItems(col)
        selectedCol= self.column_Combobox.activated[str].connect(self.drawGraph)

    def drawGraph(self,i):

        col_value=int(i.split()[1])
        x = data[:, 0].reshape(m, 1)
        y = data[:, col_value].reshape(m, 1)
        gvalue=self.graphSpinbox.value()
        iters=m //(gvalue-1)
        current_iter = 0
        val=self.timeinterval_spinbox.value()
        self.plotData(iters,x,y,current_iter,val,gvalue)

    def plotDraw(self,x ,y):

        self.MplWidget.canvas.axes.clear()
        self.MplWidget.canvas.axes.plot(x, y)
        self.MplWidget.canvas.axes.legend(('cosinus', 'sinus'), loc='upper right')
        self.MplWidget.canvas.axes.legend(('cosinus', 'sinus'), loc='upper right')
        self.MplWidget.canvas.axes.set_title('Signal')
        self.MplWidget.canvas.draw()

    def plotData(self,iters,x,y,current_iter,val,gvalue):
        while(current_iter<=m):
                print(current_iter)
                loop=QEventLoop()                    
                self.t = QTimer()
                self.plotDraw(x[current_iter:current_iter + iters], y[current_iter:current_iter + iters])
                sec_value=str(val)+str(0)+str(0)+str(0)
                QTimer.singleShot(int(sec_value), loop.quit)
                loop.exec_()
                current_iter = current_iter + iters         

if __name__ == "__main__":
    app = QApplication([])
    window = MatplotlibWidget()
    window.showMaximized()
    app.exec_()

Как вывести эти данные в виде слайд-шоу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...