为ReportLab LinePlot图添加日期标签
我正在使用reportlab来生成一个折线图,但我发现无法在X轴上使用非数字的标签。

有没有人有什么想法?
这是我的折线图类(注意:我在这个类外面做了一些计算和设置,但你大概能理解)
import reportlab
from advisor.charting.Font import Font
from reportlab.lib.colors import Color, HexColor
from reportlab.lib.pagesizes import cm, inch
from reportlab.graphics.charts.legends import Legend
from reportlab.graphics.charts.textlabels import Label
from reportlab.graphics.charts.linecharts import HorizontalLineChart
from reportlab.graphics.charts.lineplots import LinePlot
from reportlab.graphics.shapes import Drawing, String, _DrawingEditorMixin
from reportlab.graphics.widgets.markers import makeMarker
class TacticalAugLineGraph(_DrawingEditorMixin, Drawing):
def __init__(self, width=100, height=110, legend=False, *args, **kw):
apply(Drawing.__init__, (self, width, height) + args, kw)
chartFont = Font('Gotham-Bold')
self._add(self, LinePlot(), name='chart', validate=None, desc=None)
self.chart._inFill = 1
self.chart.x = 20
self.chart.y = 15
self.chart.width = 85
self.chart.height = 95
#self.chart.lineLabelFormat = '%d%%'
self.chart.yValueAxis.valueMin = 0
self.chart.yValueAxis.valueMax = 100
self.chart.yValueAxis.valueStep = 10
def apply_colors(self, colors):
self.chart.lines[0].strokeColor = colors[0]
self.chart.lines[1].strokeColor = colors[1]
self.chart.lines[2].strokeColor = colors[2]
self.chart.lines[3].strokeColor = colors[3]
1 个回答
6
我做了一个简单的例子,你可以试试看。结果可能看起来像这样:

#!/usr/bin/python
from reportlab.graphics.charts.lineplots import LinePlot
from reportlab.graphics.shapes import Drawing
from reportlab.lib import colors
from random import randint
from datetime import date, timedelta
# Generate some testdata
data = [
[(x,randint(90,100)) for x in range(0,2001,100)],
[(x,randint(30,80)) for x in range(0,2001,100)],
[(x,randint(5,20)) for x in range(0,2001,100)],
]
# Create the drawing and the lineplot
drawing = Drawing(400, 200)
lp = LinePlot()
lp.x = 50
lp.y = 50
lp.height = 125
lp.width = 300
lp._inFill = 1
lp.data = data
for i in range(len(data)):
lp.lines[i].strokeColor = colors.toColor('hsl(%s,80%%,40%%)'%(i*60))
# Specify where the labels should be
lp.xValueAxis.valueSteps = [5, 500, 1402, 1988]
# Create a formatter that takes the value and format it however you like.
def formatter(val):
#return val
#return 'x=%s'%val
return (date(2010,1,1) + timedelta(val)).strftime('%Y-%m-%d')
# Use the formatter
lp.xValueAxis.labelTextFormat = formatter
drawing.add(lp)
from reportlab.graphics import renderPDF
renderPDF.drawToFile(drawing, 'example.pdf', 'lineplot with dates')
在这个格式化器里,有两个不同的返回语句,你可以试着用它们来更好地理解这个过程。
当然,如果x轴上的数据本身就是日期,那就不需要格式化器了。在这种情况下,你只需要指定标签应该放在哪里(如果你对默认的位置不满意的话)。
上面的例子借鉴了reportlab文档第105页的想法。
祝你好运 :)