当前位置: 代码迷 >> python >> 具有大量数据的平滑matplotlib图(PyQt5)
  详细解决方案

具有大量数据的平滑matplotlib图(PyQt5)

热度:97   发布时间:2023-06-21 10:50:10.0

我正在尝试在matplotlib图上查看一些数据,这些数据来自我一直在监视的生成器,但是当我使用很多点(每天800点,并且我想显示一整个月),我很确定有一种方法可以使它看起来更平滑,或者至少可以自动过滤一些点,但是我不确定如何将其应用于PyQT5 Matplotlib小部件。 我使用PyQt5是因为我想使图具有交互性(激活另一行以显示按钮)。

我正在使用带有Emphy matplotlib画布的QMainWindow:

    from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1024, 768)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.mplwidget = MatplotlibWidget(self.centralwidget)
        self.mplwidget.setObjectName("mplwidget")
        self.gridLayout.addWidget(self.mplwidget, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Fuel Consumption Chart"))

from matplotlibwidget import MatplotlibWidget

然后,我使用另一个文件来使用该UI并自定义绘图:

import FuelUI
from PyQt5.QtWidgets import QMainWindow, QApplication
import sys
import datetime as dt
import matplotlib.dates as md
import json
import os
from FuelData import getData
from TempData import getDataTemp

class FuelChart(QMainWindow, FuelUI.Ui_MainWindow):
    def __init__(self, parent = None):
        super(FuelChart, self).__init__(parent)
        self.setupUi(self)

        self.mplwidget.axes.set_xlabel('Time (days)')
        self.mplwidget.axes.set_ylabel('Energy (BTU/h)')
        self.mplwidget.axes.set_title('Fuel Comsumption Chart')
        self.mplwidget.axes.grid(True)
        for tick in self.mplwidget.axes.get_xticklabels():
            tick.set_rotation(90)
        x, y = getData()
        xt, yt = getDataTemp()
        self.mplwidget.axes.plot(x, y, label ='Energy Consumption')
        self.mplwidget.axes.plot(xt, yt, label = 'Hot Water energy production')
        self.mplwidget.axes.legend()
        xformatter = md.DateFormatter('%d')
        self.mplwidget.axes.xaxis.set_major_formatter(xformatter)
        #self.mplwidget.figure.subplots_adjust(bottom=0.21)
        self.mplwidget.show()

if __name__ == "__main__":
    QApplication.setStyle("cleanlooks")
    app = QApplication(sys.argv)
    fuelchart = FuelChart()
    fuelchart.showFullScreen()
    sys.exit(app.exec_())

getData()和getTempData()函数是python库,可读取所有已收集数据的json。 如果执行主脚本,将获得以下内容:

如您所见,matplotlib试图显示每一个要点(在大多数情况下都很好),但是由于我有很多要点,它看起来很紧,因此开始看起来很恐怖。

有一种使它看起来更好的方法吗,有什么帮助或提示吗?

不要循环。 使用ax.xtick(rotation = 90)进行矢量化旋转调整。

存储轴的句柄(您已经完成此操作),并在调用fig.draw()之前将axis.set_xdata与axis.set_ydata一起使用。 当与Qt一起使用时,Matplotlib可以更新超过60FPS的数千点。