python-matplotlib用法示例

来源:互联网 发布:淘宝48分店铺解封2016 编辑:程序博客网 时间:2024/05/22 05:27

解决中文乱码

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

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-8import matplotlib as matimport sysreload(sys)mat.use('Agg')import matplotlib.pyplot as pltplt.rcdefaults()import numpy as npimport matplotlib.pyplot as pltfrom pylab import *from matplotlib.ticker import FuncFormatter,MaxNLocator import randomsys.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-8import matplotlib as matimport sysreload(sys)mat.use('Agg')import matplotlib.pyplot as pltplt.rcdefaults()import numpy as npimport matplotlib.pyplot as pltfrom pylab import *from matplotlib.ticker import FuncFormatter,MaxNLocator import randomimport datetimesys.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()
1 0