python基礎教程筆記-項目2-畫幅好畫-Day1,python-day1
今天開始看項目二:畫幅好畫
項目中會用到圖形產生包ReportLab,因此首先裝好這個包:easy_install reportlab
從書中可以瞭解到,這個包主要用於作圖。
比如說寫字、畫線等。執行代碼:
from reportlab.lib import colorsfrom reportlab.graphics.shapes import Drawing,String,PolyLinefrom 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 colorsfrom reportlab.graphics.shapes import Drawing,String,PolyLinefrom 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],效果是:
今天就到這裡