Я хочу визуализировать данные в 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)
Но у меня есть две проблемы с этим подходом.
Значения, данные для форматера, непредсказуемы (по крайней мере, для меня). Reportlab, кажется, изменяет тики так, как считает лучшим. В результате иногда появляются значения, которые не являются допустимыми временными метками и не могут быть проанализированы datetime
. Иногда я получал исключение, что секунды должны быть между 0 и 59. ReportLab создал тик со значением 20200225136000
.
Поскольку ось x не знает, что эти значения являются временными метками, она все еще оставляет место для 20200225135961
, 20200225135965
и т. Д. c. Результатом является разрыв в графике.
![enter image description here](https://i.stack.imgur.com/1wuT0.png)