2011-11-10 88 views
3

我正在使用reportlab生成一個LinePlot圖表。我似乎無法獲得X軸的非數字標籤。 enter image description here將日期標籤添加到reportlab LinePlot圖表

有沒有人有任何想法?

這是我Lineplot圖表類(注:IM donig這個類以外的一些計算和設置,但你得到的要點

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] 

回答

5

我製作一個簡單的例子,你可以測試其結果可能看起來像這樣的: 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條替代return語句,你可以玩得到它更好的抓地力

當然,如果x軸上的數據是以不需要任何格式化程序開始的日期,那麼您可以指定標籤的位置(如果您對默認定位不滿意)。

上面的例子借鑑了reportlab documentation中第105頁的想法。

祝你好運:)