《Python基础教程(第2版)》学习笔记(二):

您所在的位置:网站首页 python基础教程第二版 《Python基础教程(第2版)》学习笔记(二):

《Python基础教程(第2版)》学习笔记(二):

#《Python基础教程(第2版)》学习笔记(二):| 来源: 网络整理| 查看: 265

Proj2画幅好画 工作和目标

本项目是关于如何在Python中创建图形的PDF文件,使从文本文件中读取的数据可视化。本例使用的是关于太阳黑子的数据,并且会根据数据创建一个线形图。程序满足如下要求: -从Internet上下载数据文件 -分析数据文件并提取感兴趣部分 -创建基于数据的PDF文件

工具

这个项目中最重要的工具是图形生成包。文中采用的Reportlab,访问官网(http://reportlab.org)可以下载。安装完成后在shell中输入import reportlab看是否能导入。

准备工作

本项目需要用到的数据文件从(http://services.swpc.noaa.gov/text/predicted-sunspot-radio-flux.txt)上找到,部分数据格式如下图所示:

:Predicted_Sunspot_Numbers_and_Radio_Flux: Predict.txt :Created: 2015 Aug 08 0100 UTC # Prepared by the U.S. Dept. of Commerce, NOAA, Space Weather Prediction Center (SWPC). # Please send comments and suggestions to [email protected] # # Sunspot Number: S.I.D.C. Brussels International Sunspot Number. # 10.7cm Radio Flux value: Penticton, B.C. Canada. # Predicted values are based on the consensus of the Solar Cycle 24 Prediction Panel. # # See the README3 file for further information. # # Missing or not applicable data: -1 # # Predicted Sunspot Number And Radio Flux Values # With Expected Ranges # # -----Sunspot Number------ ----10.7 cm Radio Flux---- # YR MO PREDICTED HIGH LOW PREDICTED HIGH LOW #-------------------------------------------------------------- 2015 02 58.9 59.9 57.9 134.1 135.1 133.1 2015 03 57.1 59.1 55.1 132.3 133.3 131.3 2015 04 55.8 58.8 52.8 129.1 131.1 127.1 2015 05 55.0 60.0 50.0 125.4 128.4 122.4 2015 06 53.4 58.4 48.4 121.4 125.4 117.4 2015 07 51.8 57.8 45.8 117.8 121.8 113.8 2015 08 51.4 58.4 44.4 115.3 120.3 110.3 2015 09 52.0 59.0 45.0 113.4 119.4 107.4 2015 10 52.2 60.2 44.2 111.3 118.3 104.3 2015 11 51.3 60.3 42.3 109.3 117.3 101.3 2015 12 50.8 59.8 41.8 107.4 115.4 99.4 初次实现

先尝试直接把少量数据放入源代码中,如下所示:

data = [ # Year Month Predicted High Low (2007, 8, 113.2, 114.2, 112.2), (2007, 9, 112.8, 115.8, 109.8), # Add more data here ]

再调用reportlab中的shapes–PolyLine函数,最后生成PDF:

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', fontSize=18, fillColor=colors.red)) renderPDF.drawToFile(drawing,'report1.pdf','Sunspots')

完整的原型代码见Proj2画幅好画中的sunspots_roto.py文件。其中的语句 pred = [row[2]-40 for row in data]和times = [200*((row[0] + row[1]/12.0) - 2007) -110 for row in data]等对时间和值进行了处理使其能显示在正确位置。 效果如下图: 原型代码结果

再次实现

原型程序包括了基本的使用Reoportlab画图内容,但还存在缺陷:需要对值和时间做专门修改,且并不能下载数据

获取数据

使用标准模块urllib可以从Internet上获取文件。打开阅读文件时,还需要过滤掉不需要的内容,如空行和以“:”“#”开头的行。假设URL保存在变量URL内,变量COMMENT_CHARS被设定为字符串‘#:’。那么可以像下面这样获取行的列表:

data = [] for line in urlopen(URL).readlines(): if not line.isspace() and not line[0] in COMMENT_CHARS: data.append([float(n) for n in line.split()]) 使用LinePlot类

reportlab.graphics.charts.lineplots模块中的LinePlot类可以画出漂亮的折线图。它的实例化不需要任何参数,要设置的主要特性是:x、y、height、width以及data。具体代码见sunspots_ultimate.py文件。结果如下图: 最终结果图

总结

利用reportlab工具包实现了Python画图的功能,确实很方便。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3