画幅好画这个项目来源于《Python基础编程》后面的第二个项目,介绍如何在Python中创建图形创建一个pdf文件,是从文本文件中读取的数据可视化。
重要工具的介绍:
在这个项目中最重要的工具是图形生成包ReportLab 包,软件可以从http://www.reportlab.org/downloads.html下载。
初次实现版本:
初次实现先构造一个数据库,放在列表data里面。然后依次加三条曲线表示pre,low和high的分布情况,横轴均为时间,整个项目都比较容易了解。熟悉一下与研究好了。
from reportlab.lib import colors
from reportlab.graphics.shapes import *
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),
#Add more data here
]
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 = [200*((row[0] + row[1]/12.0) - 2007)-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', fonSize = 18, fillColor = colors.red))
renderPDF.drawToFile(drawing, 'report1.pdf','Sunspots')
实现效果生成为一个pdf文件:
再次实现:
相较于初次实现,主要有两个方面的改进。
其一是数据的来源,原本用文档编辑数据,现在使用标准模块urllib从Internet上获取文件。改模块中的urlopen函数和open函数含香,但是它是用一个url而不是文件名作为参数。并对数据进行初步处理,要忽略一些没用的信息,本项目主要是去除含有字符串’#’的行。
其二是画出漂亮的折线图。Reportlab内已经有这样的特性。Reportlab.graphics.charts.lineplots模块中的LinePlot类。LinePlot类的实例化不需要任何参数,然后将它添加到Drawing前设置它的几个特性。Data是表示点的坐标列表。
from reportlab.lib import colors
from reportlab.graphics.shapes import *
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),
#Add more data here
]
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 = [200*((row[0] + row[1]/12.0) - 2007)-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', fonSize = 18, fillColor = colors.red))
renderPDF.drawToFile(drawing, 'report1.pdf','Sunspots')
实现效果图:
Ps:数据来源:http://www.swpc.noaa.gov/ftpdir/weekly/Predict.txt