• 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……

  • 相关阅读:
    scss-@for 指令
    scss-@else if指令
    pandas dataframe在指定的位置添加一列, 或者一次性添加几列,re
    数据挖掘之Python调用R包、函数、脚本
    数据挖掘之各种聚类算法的比较 (转载)
    数据挖掘之分类算法概述与比较(转载)
    数据挖掘之数据规范化
    数据分析之集成算法
    数据分析之随机森林
    数据挖掘之数据规约
  • 原文地址:https://www.cnblogs.com/doublesong/p/doublesong.html
Copyright © 2020-2023  润新知