Построение значений «None» в Matplotlib - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть база данных, которая хранит значения каждую минуту, используя метку времени и значение для этой метки времени. Иногда значением является None. Я должен построить эти значения с помощью matplotlib.

Я попытался передать просто значение None, но при построении я получаю эту ошибку: "повысить TypeError (" {val! r} не строка ".format (val = val)) TypeError: None не является строкой ", поэтому я в итоге просто заменил значения None пустой строкой" ". Но это приводит к тому, что точки отображаются в виде значений" 0 ", что неправильно для моей цели. Я бы хотел, чтобы эти значения не были представлена.

Мои данные хранятся в виде словарей со значениями списка.

Это мой код:

from __future__ import unicode_literals
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
from PyQt5 import QtWidgets, QtCore
import sys
import datetime
import numpy


class MyMplCanvas(FigureCanvas):
    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)

        FigureCanvas.__init__(self, fig)
        self.setParent(parent)

        FigureCanvas.setSizePolicy(self, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)

    def compute_initial_figure(self):
        pass


class MyDynamicMplCanvas(MyMplCanvas):
    def __init__(self, *args, **kwargs):
        MyMplCanvas.__init__(self, *args, **kwargs)
        self.lines = []
        self.labels = []
        self.update_figure()

    def update_figure(self):
        processed_numeric_values = {'0022FF0000000680_6': ['16.97', '16.97', '16.97', '', '16.97', '16.97', '16.97', '16.97'], '0022FF0000000680_7': ['16.97', '16.97', '16.97', '', '16.97', '16.97', '16.97', '16.97'], '0022FF0000000680_13': ['1.00', '1.00', '1.00', '', '1.00', '1.00', '1.00', '1.00'], '0022FF0000000680_14': ['0.99', '0.99', '0.99', '', '1.00', '1.00', '1.00', '0.99']}

        processed_time_values = {'0022FF0000000680_6': [datetime.datetime(2018, 9, 3, 9, 23), datetime.datetime(2018, 9, 3, 9, 24), datetime.datetime(2018, 9, 3, 9, 25), datetime.datetime(2018, 9, 3, 9, 26), datetime.datetime(2018, 9, 3, 9, 27), datetime.datetime(2018, 9, 3, 9, 28), datetime.datetime(2018, 9, 3, 9, 29), datetime.datetime(2018, 9, 3, 9, 30)], '0022FF0000000680_7': [datetime.datetime(2018, 9, 3, 9, 23), datetime.datetime(2018, 9, 3, 9, 24), datetime.datetime(2018, 9, 3, 9, 25), datetime.datetime(2018, 9, 3, 9, 26), datetime.datetime(2018, 9, 3, 9, 27), datetime.datetime(2018, 9, 3, 9, 28), datetime.datetime(2018, 9, 3, 9, 29), datetime.datetime(2018, 9, 3, 9, 30)], '0022FF0000000680_13': [datetime.datetime(2018, 9, 3, 9, 23), datetime.datetime(2018, 9, 3, 9, 24), datetime.datetime(2018, 9, 3, 9, 25), datetime.datetime(2018, 9, 3, 9, 26), datetime.datetime(2018, 9, 3, 9, 27), datetime.datetime(2018, 9, 3, 9, 28), datetime.datetime(2018, 9, 3, 9, 29), datetime.datetime(2018, 9, 3, 9, 30)], '0022FF0000000680_14': [datetime.datetime(2018, 9, 3, 9, 23), datetime.datetime(2018, 9, 3, 9, 24), datetime.datetime(2018, 9, 3, 9, 25), datetime.datetime(2018, 9, 3, 9, 26), datetime.datetime(2018, 9, 3, 9, 27), datetime.datetime(2018, 9, 3, 9, 28), datetime.datetime(2018, 9, 3, 9, 29), datetime.datetime(2018, 9, 3, 9, 30)]}

        for eui_attr in processed_numeric_values.keys():
            line, = self.axes.plot(numpy.array(processed_time_values[eui_attr]),
                               numpy.array(processed_numeric_values[eui_attr]),
                               visible=True,
                               marker='o', markersize=5, lw=2, label=eui_attr)
        self.labels.append(eui_attr)
        self.lines.append(line)
        if self.labels:
            self.axes.legend(loc=1, ncol=2, fontsize='xx-small', frameon=True, fancybox=True, facecolor=(0.7, 0.7, 0.7))
        self.draw()

class ApplicationWindow(QtWidgets.QMainWindow):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        self.setWindowTitle("application main window")

        self.main_widget = QtWidgets.QWidget(self)

        l = QtWidgets.QVBoxLayout(self.main_widget)
        dc = MyDynamicMplCanvas(self.main_widget, width=5, height=4, dpi=100)
        l.addWidget(dc)

        self.setCentralWidget(self.main_widget)

        self.statusBar().showMessage("All hail matplotlib!", 2000)


qApp = QtWidgets.QApplication(sys.argv)
aw = ApplicationWindow()
aw.show()
sys.exit(qApp.exec_())
#qApp.exec_()

Вот что я получаю сейчас: enter image description here

Вот чего я хочу достичь: enter image description here

Я хотел бы сохранить словари, потому что они являются частью более сложного кода, просто для замены "" значениями None, чтобы они не интерпретировались как значения "0".

Есть ли способ сделать это?

EDIT:

Словари данных имеют следующую структуру:

processed_numeric_values = {'0022FF0000000680_6': [numeric_values], '0022FF0000000680_7': [numric_values], '0022FF0000000680_13': [numeric_values], '0022FF0000000680_14': [numeric_values]}

processed_time_values = {'0022FF0000000680_6': [datetime_values], '0022FF0000000680_7': [datetime_values], '0022FF0000000680_13': [datetime_values], '0022FF0000000680_14': [datetime_values]}

Словари содержат одинаковые ключи, и каждая клавиша представляет одну строку на диаграмме. В словаре processing_numeric_values ​​представлены данные по оси Y, а в словаре processing_time_values ​​представлены данные по оси X.

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