今天开始看项目二:画幅好画
项目中会用到图形生成包ReportLab,因此首先装好这个包:easy_install reportlab
从书中可以了解到,这个包主要用于作图。
比如说写字、画线等。执行代码:
from reportlab.lib import colors
from reportlab.graphics.shapes import Drawing,String,PolyLine
from reportlab.graphics import renderPDF
d = Drawing(100,100)
d.add(String(50,50,'Hello world',textAnchor = 'middle'))
d.add(PolyLine([(0,0),(10,0),(10,10),(0,10)],strokeColor=colors.blue))
renderPDF.drawToFile(d,'h.pdf','A TEST')
在当前目录文件下可获得一个名为h的pdf文件,文件内容为:
从代码中可看出d为一个100*100的画布,通过在画布添加想要绘制的变量,最后执行renderPDF.drawToFile函数将d显示为pdf文件。
最后书上绘制了一个初步的sunspot线。代码如下:
from reportlab.lib import colors
from reportlab.graphics.shapes import Drawing,String,PolyLine
from reportlab.graphics import renderPDF
data = [
# Year Month Predicted High Low
(2007, 8, 113.2, 114.2, 112.2),
(2007, 9, 112.8, 115.8, 109.8),
(2007, 10, 111.0, 116.0, 106.0),
(2007, 11, 109.8, 116.8, 102.8),
(2007, 12, 107.3, 115.3, 99.3),
(2008, 1, 105.2, 114.2, 96.2),
(2008, 2, 104.1, 114.1, 94.1),
(2008, 3, 99.9, 110.9, 88.9),
(2008, 4, 94.8, 106.8, 82.8),
(2008, 5, 91.2, 104.2, 78.2),
]
drawing = Drawing(200,150)
pred = [row[2]-40 for row in data]
high = [row[3]-40 for row in data]
low = [row[4]-40 for row in data]
times = [((row[0] + row[1]/12.0) - 2007)*200 - 110 for row in data]
drawing.add(PolyLine(zip(times,pred),strokeColor = colors.blue))
drawing.add(PolyLine(zip(times,high),strokeColor = colors.red))
drawing.add(PolyLine(zip(times,low),strokeColor = colors.green))
drawing.add(String(65,115,'Sunspots',fontSize=18,fillColor=colors.red))
renderPDF.drawToFile(drawing,'hello.pdf','A Simple PDF file')
执行效果:
这段代码中一开始有两个地方没看懂:
1.zip函数
2.pred,high和low的赋值
先看下赋值。pred = [row[2]-40 for row in data],感觉就是说这样就能生成一个list?
代码试下:
l = [
(1,2),
(3,4),
(5,6),
(7,8)]
b = [r[1] for r in l]
print b
也就是说把l中每个元素r的r[1]加入b中。执行结果:
结果显示差不多就是这么个意思
接下来看zip函数
网上查到zip函数功能为接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表。
直接代码测试下:
也就是说zip将N个参数的第1,2,。。。r个元素分别组成了r个参数为N1,N2,。。。Nn的tuple。
至于times为什么要赋值为 [((row[0] + row[1]/12.0) - 2007)*200 - 110 for row in data],是因为要把图放在文件中合适的位置上。
试了下把times赋值为times = [((row[0] + row[1]/12.0) - 2007) for row in data],效果是:
今天就到这里