解决中文乱码
首先说一下比较常见的的问题,中文乱码的问题,解决方法如下。
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()