Гладкий сюжет matplotlib с большим количеством данных (PyQt5) - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь просмотреть некоторые данные на графике matplotlib, данные взяты из генератора, который я отслеживал, но линия графика выглядит ужасно, так как я использую много точек (800 в день, и яя хочу показать весь месяц), я почти уверен, что есть способ сделать его более плавным или, по крайней мере, автоматически отфильтровать некоторые точки, но я не уверен, как применить его к виджету PyQT5 Matplotlib.Я использую PyQt5, потому что я хочу сделать график интерактивным (активировать другие строки для отображения с помощью кнопок).

Я использую QMainWindow с холстом emphy matplotlib:

    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

Затем я использую другой файл для использования этого пользовательского интерфейса и настройки своего графика:

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 голосов
/ 18 сентября 2018

Не зацикливаться. Используйте ax.xtick (вращение = 90) для векторизованной регулировки вращения.

Сохраните дескриптор оси (вы уже сделали это) и используйте axis.set_xdata с axis.set_ydata перед вызовом figure.draw (). Matplotlib может обновлять несколько тысяч точек, превышающих 60FPS, при использовании с Qt.

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