将日期标签添加到reportlab LinePlot图表

时间:2011-11-10 16:26:24

标签: python django charts reportlab

我使用reportlab生成LinePlot图表。我似乎无法获得X轴的非数字标签。 enter image description here

有没有人有任何想法?

这是我的Lineplot图表类(注意:我不在本课程之外进行一些计算和设置,但是你得到了要点

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 个答案:

答案 0 :(得分:6)

我制作了一个你可以测试的简单例子。结果可能如下所示: enter image description here

#!/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')

在格式化程序中,您可以使用2个备用返回语句来更好地掌握它。

当然,如果x轴上的数据是开始的日期,则不需要任何格式化程序,在这种情况下,您只需指定标签的位置(如果您对默认定位不满意)。 / p>

上面的例子借用了reportlab documentation中的第105页的想法。

祝你好运:)