码迷,mamicode.com
首页 > 编程语言 > 详细

python基础教程总结15——2 画幅好画

时间:2015-07-27 13:09:44      阅读:437      评论:0      收藏:0      [点我收藏+]

标签:

要求:从Internet上下载数据文件;  分析数据文件并提取感兴趣的部分

工具:图形生成包(ReportLab,PYX等)

数据:太阳黑子和射电辐射流量(http://services.swpc.noaa.gov/text/predicted-sunspot-radio-flux.txt)

    技术分享

 

1. 简单实现

1.1 用ReportLab画图

  将字符串“Hello world”画在一个100*100像素的大小的PDF图形中间:创建一个给定大小的图纸(drawing);然后创建带有某些属性的图形元素,本例是一个string对象;接着将元素添加到图纸中去;最后将图纸生成为PDF格式并保存。

  技术分享

  

from reportlab.graphics.shapes import Drawing ,String
from reportlab.graphics import renderPDF

d=Drawing(100,100)
s=String(50,50,Hello,world!,textAnchor=middle)

d.add(s)

renderPDF.drawToFile(d,hello.pdf,A simple PDF file)

 

1.2 原型

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)
     ]

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]

#PolyLine画折线
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,Sunsports)

技术分享

 

2. 再次实现

1)获取数据

  使用标准模块urllib可以从Internet获取文件。模块中的urlopen函数类似于open函数,参数是一个URL而不是文件名。打开阅读文件时,需要过滤掉不需要的内容。文件包含空行以及每行都以一些特殊的字符开始(#和:),应该忽略。

#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() ])

2)使用LinePlot类

  LinePlot类的实例化不需要任何参数,然后在将它添加到Drawing前设置特性:想,一,height,width以及data(元组列表)

3)最终程序:

 

from urllib import urlopen
from reportlab.graphics.shapes import *
from reportlab.graphics.charts.lineplots import LinePlot
from reportlab.graphics.charts.textlabels import Label
from reportlab.graphics import renderPDF

URL = ‘http://services.swpc.noaa.gov/text/predicted-sunspot-radio-flux.txt
COMMENT_CHARS = #:

drawing = Drawing(400, 200)
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()])

pred = [row[2] for row in data]
high = [row[3] for row in data]
low = [row[4] for row in data]
times = [row[0] + row[1]/12.0 for row in data]
lp = LinePlot()
lp.x = 50
lp.y = 50
lp.height = 125
lp.width = 300
lp.data = [zip(times, pred),zip(times,high),zip(times, low)]
lp.lines[0].strokeColor = colors.blue
lp.lines[1].strokeColor = colors.red
lp.lines[2].strokeColor = colors.green

drawing.add(lp)
drawing.add(String(250,150, Sunspots,fontSize=14,fillColor=colors.red))

renderPDF.drawToFile(drawing, report3.pdf,Sunspots)

技术分享

 

python基础教程总结15——2 画幅好画

标签:

原文地址:http://www.cnblogs.com/zxqstrong/p/4679785.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!