Matplotlib画图

matplotlib是python中一个用于画图的一个包,它提供了与Matlab很相似的API包。它可以与python用于实现科学计算的包numpy相结合画出很精美的图形。

matplotlib官网:http://matplotlib.sourceforge.net/

 分别用如下命令安装numpy和matplotlib

sudo apt-get install python-numpy

sudo apt-get install python-matplotlib

一、画饼图

代码:

import matplotlib.pyplot as pl
from pylab import *

figure(1, figsize=(10,6)) #创建一个图形区域 长10 宽6
ax = axes([0.1, 0.1, 0.6, 0.8])#坐标轴起始点为0.1,0.1从左下开始,长度占整个区域的0.6,高占0.8

labels = '43%', '7%', '43%', '7%' #饼图的lables
fracs = [6,1,6,1] #饼图所分成的区域

pie(fracs, labels=labels) #按分成的区域画饼图 并加上lables
legend((u"在理想范围以上: 6",u"在理想范围以下: 1",u"在理想范围内:   6",u"低血糖:         1"),loc=5 , bbox_to_anchor = (1.5, 0.5)) #loc=5为在右侧后面是在针对坐标轴的位置

text(1.8,0.5,u"结果",fontsize=12) #text针对坐标轴的坐标
title(u"总数")
show()

Matplotlib画图

关于显示中文的问题:

  1. 在windows中为了能显示出中文,进行如下操作

1)        找到c:\python24\lib\site-packages\matplotlib\mpl-data\matplotlibrc (修改font.sans-serif、verbose.level两行代码)

l  找到font.sans-serif一行,将后边直接改成一个nothing;(把 “:”后的“#......”都去掉)

l  找到verbose.level一行,把默认的silent改成debug

2)        把此文件夹中的Vera.ttf

替换C:\Python27\Lib\site-packages\matplotlib\mpl-data\fonts\ttf 中的文件

 2.在linux中(ubuntu)

  将ubuntu中任意一个中文字体(在/user/share/fonts/truetype/)命名为cmb10.ttf 替换matplotlib中的字体文件(在/usr/share/matplotlib/mpl-data/fonts/ttf/)

二、将Matplotlib画好的结果在html中显示

用Django(python语言写的web开发框架)

  1. 安装Django
  2. 在指定文件夹中运行

django-admin.py startproject mpldjango

这样创建了一个工程 mpldjango

3.    在mpldjango工程文件夹目录中,有一个manage.py 运行它创建画图的app(mpldjango/manage.py)

python manage.py startapp mpl

4.   在/mpldjango/mpl/views.py 编写画图函数

5.   编写完之后,在mpldjango/urls.py中修改url 改为

urlpatterns = patterns('',(r'mplimage.png','mpl.views.mplimage'),

6.  在mpldjango工程目录下运行

python manage.py runserver

打开浏览器,在地址栏输入http:// 127.0.0.1:8000/mplimage.png

结果:

Matplotlib画图

之前画出的图形是直接在figure()上,现在通过FigureCanvas(fig)得到画得图,然后以图形png的形显示出来

代码:

# Create your views here.
import django
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
import matplotlib.pyplot as pl
from matplotlib.figure import Figure
from pylab import*
import numpy as np

def mplimage(request):
    fig=Figure()
    canvas=FigureCanvas(fig)
    ax=fig.add_subplot(121)
    labels = '43%', '7%', '43%', '7%'
    fracs = [6,1,6,1]
   
    ax.pie(fracs,labels=labels)
   
    ax.legend(('Above the ideal range:6','Below the ideal range:1','In the ideal range:6','Hypoglycemia:1'),loc=5 , bbox_to_anchor = (2.5, 0.5))
   
    ax.set_title('Total')
  
    response=django.http.HttpResponse(content_type='image/png')
    canvas.print_png(response)#
    return response

三、横坐标为时间的二维曲线

利用plot可以画出任意x,y为整形或者浮点型的二维图。现在若想得到横坐标为时间的图,需要使用plot_date(dates,value,线型)

dates是年月日的很好处理,在官网的例子中都有,例如横坐标为几年、一年中的几个月、一星期中的每天

eg:

rule = rrulewrapper(YEARLY, byeaster=1, interval=5)
loc = RRuleLocator(rule)
formatter = DateFormatter('%m/%d/%y')
date1 = datetime.date( 1952, 1, 1 )#开始时间
date2 = datetime.date( 2004, 4, 12 )#结束时间
delta = datetime.timedelta(days=100)
 dates = drange(date1, date2, delta)#得到横坐标的dates

把横坐标显示成H:M:S形式,显示一天中的几个时间段。这个太头疼了……

开始的时候一直找API想通过改变Formatter直接改成%H%M%S各种的报错,后来又想把每个横坐标的时间点用字符串表示然后在转换成times形式一直也没有成功。最终……

代码:

import pytz
import time

……

est=pytz.timezone('US/Eastern')#用格林尼时间
    n=15  #这个n要和纵坐标也就是下面的valuse的值得数量一致,否则x,y维数不同的错误  

    duration=72000#横坐标是之间差是2小时 换算成分钟
    t=(6,0,0,0,0,0,0,0,0)
    now=time.mktime(t) #mktime(t)中的t必须是一个9元祖 t是从1970/1/1开始的秒数影响横坐标开始的时间
    timestamps=np.linspace(now,now+duration,n)
    dates=[datetime.datetime.fromtimestamp(ts,est) for ts in timestamps]#让dates是以时间的形式 在timestamps内循环12词
    value = [2,4,5,3,4,4,5,5,7,7,6,8,10,10,11]#自己随便填的数字

 ax.plot_date(dates,value,linestyle='p')#关键的画线,p是线性只显示点不显示中间显得模式

labels = ax.get_xticklabels()#lables得到我们设置的横坐标
    setp(labels, rotation=30, fontsize=10)#让横坐标标注旋转30度角 要不显示不下

结果:

Matplotlib画图

时间轴上总是有UTC formatter之类的也不管用,只能这样了……

怎么把画好的结果放到设计好的html中呢???纠结ing……

posted @ 2012-07-20 20:46  double_song  阅读(2371)  评论(0编辑  收藏  举报