从文件中绘制数据会杀死 GUI

我尝试根据文件中的数据绘制图表。比如一组数据有几个图表点是没问题的,就画出来了。然而,我要绘制的数据量在不断增长,目前约为15000点。当我尝试加载和绘制它们时,应用程序界面崩溃。我的代码如下。数据文件在这里:testdata.txt你能告诉我如何处理吗?

import sys

from PyQt5.QtWidgets import QDialog, QApplication, QPushButton, QVBoxLayout 

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas 

from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar 

import matplotlib.pyplot as plt 




class Window(QDialog):

    def __init__(self):

        super().__init__()


        title = "Wykresy"


        self.setWindowTitle(title)


        # a figure instance to plot on 

        self.figure = plt.figure() 

   

        # this is the Canvas Widget that  

        # displays the 'figure'it takes the 

        # 'figure' instance as a parameter to __init__ 

        self.canvas = FigureCanvas(self.figure) 

   

        # this is the Navigation widget 

        # it takes the Canvas widget and a parent 

        self.toolbar = NavigationToolbar(self.canvas, self) 

   

        # Just some button connected to 'plot' method 

        self.button = QPushButton('Plot') 

           

        # adding action to the button 

        self.button.clicked.connect(self.plot) 

   

        # creating a Vertical Box layout 

        layout = QVBoxLayout() 

           

        # adding tool bar to the layout 

        layout.addWidget(self.toolbar) 

           

        # adding canvas to the layout 

        layout.addWidget(self.canvas) 

           

        # adding push button to the layout 

        layout.addWidget(self.button) 

           

        # setting layout to the main window 

        self.setLayout(layout) 



        self.showMaximized()


        



    def plot(self):

        with open('testdata.txt') as f:

            lines = f.readlines()

            x = [line.split('\t')[0] for line in lines]

            y = [line.split('\t')[1] for line in lines]

    


        # clearing old figure 

        self.figure.clear() 



慕姐4208626
浏览 161回答 2
2回答

有只小跳蛙

主要瓶颈似乎是调用,它为这 15k 点中的每一个autofmt_xdate()点添加了一个日期标签。发生这种情况是因为您的 x 标签实际上不是日期;而是日期。就 pyplot 而言,它们只是任意字符串,因此它不知道要保留哪些以及要丢弃哪些。y 标签也发生了类似的情况。将 x 解析为datetime对象,将 y 解析为floats:from datetime import datetime...        x = [datetime.strptime(line.split('\t')[0], '%Y-%m-%d %H:%M:%S') for line in lines]        y = [float(line.split('\t')[1]) for line in lines]现在,我在 x 轴上每小时获得一次刻度,在 y 轴上每 2.5 度获得一次刻度。渲染几乎是瞬时的。在尝试绘制数据之前,您还应该考虑对数据进行下采样。无论如何,15000 点远远超出了典型计算机屏幕的水平分辨率。

慕哥9229398

您可以使用pandas读取文件,这可能比循环内容更快。(...)def plot(self):    df = pd.read_csv('testdata.txt', sep='\t', header=None, parse_dates=[0])    (...)    # plot data    ax.plot(df[0], df[1], c='r', label='temperature')
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python