# yahoochart.py
import string, copy, urllib
from reportlab.lib import colors
from reportlab.graphics import shapes
from reportlab.graphics import renderPDF, renderPM
from reportlab.graphics.charts import linecharts
from reportlab.graphics.widgets import markers
mm = markers.makeMarker
def makeChart(titles, data, cats):
x, y, w, h = 50, 50, 300, 125
# make chart
lc = linecharts.HorizontalLineChart()
lc.x, lc.y = x, y
lc.width, lc.height = w, h
lc.data = data
lc.lines.strokeWidth = 1.5
lc.lines[0].strokeColor = colors.blue
lc.lines[0].symbol = mm('Circle')
lc.lines[1].strokeColor = colors.aqua
lc.lines[1].symbol = mm('Diamond')
lc.valueAxis.valueMin = 0
lc.valueAxis.valueStep = 25
lc.valueAxis.valueMax = 1.2*max(map(max, data))
lc.valueAxis.visibleGrid = 1
lc.valueAxis.gridStrokeColor = colors.black
lc.valueAxis.gridEnd = w
lc.categoryAxis.tickDown = 0
lc.categoryAxis.categoryNames = cats
lc.categoryAxis.labels.boxAnchor = 'e'
lc.categoryAxis.labels.dy = -2
lc.categoryAxis.labels.angle = 90
lc.categoryAxis.labels.fontSize = 8
drawing = shapes.Drawing(400, 200)
drawing.add(lc)
# make titles
tdata = [(70, 160, titles[0], colors.blue),
(70, 80, titles[1], colors.aqua)]
for x, y, str, col in tdata:
t = apply(shapes.String, [x, y, str])
t.fontName = "Helvetica-Bold"
t.fontSize = 10
t.fillColor = col
drawing.add(t)
return drawing
close = lambda l: float(l[:-1].split(',')[-2])
date = lambda l: l[:-1].split(',')[0]
base = "
http://table.finance.yahoo.com/"
format = "table.csv?a=1&b=1&c=2002&d=7&e=31&f=2002"
format = format + "&s=%s&y=0&g=w&ignore=.csv"
values = []
for val in ['ibm', 'aapl']:
url = base + format % val
lines = urllib.urlopen(url).readlines()
cats = map(date, lines[1:])
cats.reverse()
closeVals = map(close, lines[1:])
closeVals.reverse()
values.append(closeVals)
d = makeChart(['IBM', 'Apple'], values, cats)
renderPM.drawToFile(d, "yahoo.png", "PNG")