python-matplotlib用法示例

解决中文乱码

首先说一下比较常见的的问题,中文乱码的问题,解决方法如下。

import matplotlib  
matplotlib.use('qt4agg')  
from matplotlib.font_manager import *  
import matplotlib.pyplot as plt  
#定义自定义字体,文件名从1.b查看系统中文字体中来  
myfont = FontProperties(fname='/usr/share/fonts/mcyh/mcyh.ttf')  
#解决负号'-'显示为方块的问题  
matplotlib.rcParams['axes.unicode_minus']=False  
plt.plot([-1,2,-5,3])  
plt.title(u'中文',fontproperties=myfont)  

上面的fname需要通过以下命令查看.

fc-list :lang=zh

但是可能不存在中文字体,此时莫慌,进入windows的C:\Winodws\Fonts目录,里面有很多ttf文件,拷贝到以下目录即可。

/usr/share/fonts/

切入正题

  1. 画折线图 、柱状图的代码如下
#coding=utf-8
import matplotlib as mat
import sys
reload(sys)
mat.use('Agg')
import matplotlib.pyplot as plt
plt.rcdefaults()
import numpy as np
import matplotlib.pyplot as plt
from pylab import *
from matplotlib.ticker import FuncFormatter,MaxNLocator 
import random

sys.setdefaultencoding('utf-8')

#data=np.loadtxt(file, delimiter=',')

x_pos=range(0,1440)
repeat_ratio=[]
time=[]

for i in range(0, 1440):
    repeat_ratio.append(random.random())


for k in range(24):
    if k % 3 == 0:
        hour='%02d' %k
        min='00'
        time.append(hour+':'+min)
    else:
        time.append('') 
    for i in range(59):
        time.append('')


xticks=range(0, 1441, 180)#设置x轴步长
xlabels=[str(n * 3) +':00' for n in range(0, len(xticks), 1)]#x坐标显示的字符

plt.figure(num=0, figsize=(20, 10))
plt.bar(x_pos, repeat_ratio, align='center', alpha=0.3, facecolor='y')#画柱状图
#plt.plot(x_pos, repeat_ratio,'-b')#画折线图
plt.ylabel('repeat rate/%')
plt.xlim(0,1440)
plt.ylim(0, 1)
plt.title('Repeat Rate')
plt.grid(True)
#plt.xticks(np.arange(1440),time)
plt.xticks(xticks, xlabels)

def percentage_format(x,pos=0):
    return '%1.2f%%'%(x*100)
gca().yaxis.set_major_formatter(FuncFormatter(percentage_format))#纵坐标按百分数输出
plt.savefig('repeat.jpg')

plt.close(0)

折线图:
这里写图片描述
柱状图:
这里写图片描述
2. 下面是封装好了的画折线图、饼图、柱状图的代码。

#coding=utf-8
import matplotlib as mat
import sys
reload(sys)
mat.use('Agg')
import matplotlib.pyplot as plt
plt.rcdefaults()
import numpy as np
import matplotlib.pyplot as plt
from pylab import *
from matplotlib.ticker import FuncFormatter,MaxNLocator 
import random
import datetime
sys.setdefaultencoding('utf-8')

folder="pic/"

def getYesterday():
    #获得当前时间时间戳
    today = datetime.date.today()
    yesterday = today - datetime.timedelta(days=1)
    #转换为其他日期格式,如:"%Y-%m-%d %H:%M:%S"
    return yesterday.strftime("%Y-%m-%d")

def getYesterday2():
    today = datetime.date.today()
    yesterday = today - datetime.timedelta(days=1)
    return yesterday.strftime("%Y.%m.%d")

def loadData(filename):
    file = open(filename)
    return np.loadtxt(file,dtype={'names': ('first', 'second'),'formats': ('i4', 'i8')})

#画柱状图
def drawReuseBar(data,yesterday,house_number):
    x = data[:]['first']
    y = data[:]['second']
    xticks = range(0,60)
    plt.figure(num=0, figsize=(20, 10))
    plt.bar(x,y,align='center', alpha=1, facecolor='b') 
    plt.title("Reuse Time Difference-%s-%d"%(yesterday,house_number))
    plt.grid(True)
    plt.xlabel('Time Difference(minutes)')  
    plt.ylabel('cnt')  
    plt.xlim(0,61)
    pic_folder="%s%s"%(folder,yesterday)
    plt.savefig("%s/%s.%d.bar.jpg"%(pic_folder,yesterday,house_number))
    plt.close(0)

#画饼图
def drawReusePie(data,yesterday,house_number):
    plt.figure(num=2, figsize=(15,15))  
    ax = axes([0.1, 0.1, 0.8, 0.8])  

    labels = data[:]['first']
    fracs = data[:]['second']

    x=[0,0,0,0,0,0,0]
    y=['0≤ X<10min','10min≤ X<20min','20≤ X<30min','30min≤ X<40min','40min≤ X<50min','50min≤ X<60min','X≥ 60min']

    for i in range(0,len(labels)):
        if(labels[i]!=60):
            x[(labels[i]-1)/10]+=fracs[i]
        else:
            x[6]=fracs[i]

    x[1],x[4]=x[4],x[1]
    y[1],y[4]=y[4],y[1]

    x[3],x[6]=x[6],x[3]
    y[3],y[6]=y[6],y[3]

    x[4],x[5]=x[5],x[4]
    y[4],y[5]=y[5],y[4]

    explode=(0,0,0,0,0,0,0)
    plt.pie(x, explode=explode, labels=y, autopct='%1.1f%%', shadow=False,colors=("#00EC00","#0080FF","#A6A600","#D26900","#3C3C3C","#FF359A","#8080C0"))  
    plt.legend()
    #title('Reuse Distence', bbox={'facecolor':'0.8', 'pad':5})  
    plt.title("Reuse Time Difference-%s-%d"%(yesterday,house_number))
    pic_folder="%s%s"%(folder,yesterday)
    plt.savefig("%s/%s.%d.pie.jpg"%(pic_folder,yesterday,house_number))
    plt.close(2)

#画折线图
def drawReuseCurve(data,yesterday,house_number):
    x = data[:]['first']
    y = data[:]['second']

    xx = []
    yy = []

    xx.append(0)
    yy.append(y[0])
    xx.append(x[0])
    yy.append(y[0])

    for i in range(1,len(y)):
        xx.append(x[i-1])
        y[i]+=y[i-1]
        yy.append(y[i])
        xx.append(x[i])
        yy.append(y[i])

    for i in range(0,len(yy)):
        yy[i] = yy[i]*1.0/100

    for i in range(0,len(y)):
        y[i] = y[i]*1.0/100

    plt.figure(num=1, figsize=(20, 10))
    plt.plot(xx, yy,'-b')#画折线图
    plt.ylabel('ratio/%')
    plt.xlabel('Time Difference(minutes)')
    plt.ylim(0, 1.1)
    plt.xlim(1,60)
    plt.title("Reuse Time Difference-%s-%d"%(yesterday,house_number))
    plt.grid(True)

    def percentage_format(x,pos=0):
        return '%1.2f%%'%(x*100)

    gca().yaxis.set_major_formatter(FuncFormatter(percentage_format))#纵坐标按百分数输出
    pic_folder="%s%s"%(folder,yesterday)
    plt.savefig("%s/%s.%d.curve.jpg"%(pic_folder,yesterday,house_number))
    plt.close(1)

def main():
    house_id = int(sys.argv[1])
    yesterday = getYesterday()
    filename = "/data/joyyzhang/reuse_result/%d/%s"%(house_id,yesterday)
    data = loadData(filename)
    drawReuseBar(data,getYesterday2(),house_id)
    filename = "/data/joyyzhang/reuse_result/%d/%s.handle"%(house_id,yesterday)
    file = open(filename)
    data = np.loadtxt(file,dtype={'names': ('first', 'second'),'formats': ('i4', 'f4')})
    drawReusePie(data,getYesterday2(),house_id)
    drawReuseCurve(data,getYesterday2(),house_id)

if __name__ == "__main__":
    main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值