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

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 swpc.webmaster@noaa.gov
#
# 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画图的功能,确实很方便。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值