您的位置:首页 > 编程语言 > Python开发

python-matplotlib用法示例

2016-07-13 10:41 337 查看

解决中文乱码

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

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/


切入正题

画折线图 、柱状图的代码如下

#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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  numpy matplotlib