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

时间:2018-09-18 02:11:32

标签: python matplotlib pyqt5

我正在尝试在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。如果执行主脚本,则会得到以下信息:

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

有一种方法可以使它看起来更好吗?有任何帮助或提示吗?

1 个答案:

答案 0 :(得分:0)

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

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