ReportLab Ось LinePlot с датой и временем - PullRequest
3 голосов
/ 25 февраля 2020

Я хочу визуализировать данные в LinePlot, используя reportlab. Данные имеют значения оси X (временные метки) в форме YYYYMMDDHHMMSS. Я знаю, что класс оси отчета NormalDateXValueAxis существует, но он принимает только даты (YYYYMMDD) и не позволяет использовать время.

Один вопрос: поддерживает ли reportlab это с любым классом, который я еще не нашел?

Другой подход, который я пытаюсь, - просто использовать строку метки времени как Значения оси X и определите форматер для этих значений. Пример:

from reportlab.graphics.charts.lineplots import LinePlot
from reportlab.graphics.shapes import Drawing, _DrawingEditorMixin
from datetime import datetime


def formatter(val):
    dtstr = str(int(val))
    print(dtstr)
    dt = (datetime.strptime(str(int(val)), "%Y%m%d%H%M%S")).strftime("%d.%m.%Y %H:%M:%S")
    return dt

class Test(_DrawingEditorMixin, Drawing):

    def __init__(self,width=258,height=150,*args,**kw):
        Drawing.__init__(self,width,height,*args,**kw)
        # font
        fontSize = 7
        # chart
        self._add(self,LinePlot(),name='chart',validate=None,desc=None)
        self.chart.y                = 16
        self.chart.x                = 32
        self.chart.width            = 212
        self.chart.height           = 90
        # x axis
        self.chart.xValueAxis.labels.fontSize       = fontSize-1
        self.chart.xValueAxis.labelTextFormat       = formatter
        # y axis
        self.chart.yValueAxis.labels.fontSize       = fontSize -1
        # sample data
        self.chart.data = [
            [
                (20200225130120, 100),
                (20200225130125, 0),
                (20200225130130, 300),
                (20200225130135, 0),
                (20200225130140, 500),
                (20200225130145, 0),
                (20200225130150, 700),
                (20200225130155, 0),
                (20200225130315, 900)
            ]
        ]

if __name__=="__main__": #NORUNTESTS
    Test().save(formats=['pdf'],outDir='.',fnRoot=None)

Но у меня есть две проблемы с этим подходом.

  1. Значения, данные для форматера, непредсказуемы (по крайней мере, для меня). Reportlab, кажется, изменяет тики так, как считает лучшим. В результате иногда появляются значения, которые не являются допустимыми временными метками и не могут быть проанализированы datetime. Иногда я получал исключение, что секунды должны быть между 0 и 59. ReportLab создал тик со значением 20200225136000.

  2. Поскольку ось x не знает, что эти значения являются временными метками, она все еще оставляет место для 20200225135961, 20200225135965 и т. Д. c. Результатом является разрыв в графике.

enter image description here

1 Ответ

0 голосов
/ 05 марта 2020

Один вопрос: поддерживает ли reportlab это с любым классом, который я еще не нашел?

Не знаю, но я думаю, что вы можете достичь с помощью ValueAxis , Если вы можете изменить библиотеку, я предлагаю вам сделать matplotlib , как я видел предыдущих рабочих примеров . Вы также можете попытаться проверить, имеет ли PYX (который также является хорошей альтернативой ReportLab) такой сценарий ios, но я не нашел ни одного.

...