python基础教程笔记-项目2-画幅好画-Day1
今天开始看项目二:画幅好画
项目中会用到图形生成包ReportLab,因此首先装好这个包:easy_install reportlab
从书中可以了解到,这个包主要用于作图。
比如说写字、画线等。执行代码:
from reportlab.lib import colors
from reportlab.graphics.shapes import Drawing,String,PolyLine
from reportlab.graphics import renderPDFd = 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 renderPDFdata = [
# 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],效果是:
今天就到这里
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
