为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕姐4208626 2023-06-27 14:12:00
我尝试根据文件中的数据绘制图表。比如一组数据有几个图表点是没问题的,就画出来了。然而,我要绘制的数据量在不断增长,目前约为15000点。当我尝试加载和绘制它们时,应用程序界面崩溃。我的代码如下。数据文件在这里:testdata.txt你能告诉我如何处理吗?import sysfrom 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() 
查看完整描述

2 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

主要瓶颈似乎是调用,它为这 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 点远远超出了典型计算机屏幕的水平分辨率。


查看完整回答
反对 回复 2023-06-27
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

您可以使用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')


查看完整回答
反对 回复 2023-06-27
  • 2 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信