python对数据统计特别友好,原生库即有相关支持:matplotlib
1.环境配置
sudo pip install matplotlib
安装完成后需要调整下配置文件(mac可跳过),原因:python解释器各个平台版本都有,理论上会cover大多数底层接口,所以看起来“跨平台”。但是部分与绘图/进程/系统内核等相关功能,不同系统间差异较大,python尚未全cover。比如我们matplotlib在不同系统上兼容性就有点问题,所以需要通过配置文件来获得“跨平台”的效果。针对matplotlib有合适的egg包可以解决,修改配置文件让egg包生效即可。
where is matlotlibrc
即可获得配置文件路径(windows请全盘搜索),打开文件把backend改为以下Agg:
# The default backend; one of GTK GTKAgg GTKCairo GTK3Agg GTK3Cairo
# CocoaAgg MacOSX Qt4Agg Qt5Agg TkAgg WX WXAgg Agg Cairo GDK PS PDF SVG
# Template.
# You can also deploy your own backend outside of matplotlib by
# referring to the module name (which must be in the PYTHONPATH) as
# ‘module://my_backend’.
backend : Agg
2.hello world
# coding:utf-8
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np
import os
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.plot( [12,34,56,78,90])#输入一个成员都是数字的数组
plt.savefig('tmp.png')#保存为图片
plt.close('all')#清空画布。不要省略这一句,不然多个图会有bug。
一共3句,一句都不能少,这就输出了个图片“tmp.png”
3.定制坐标轴
plt.plot( [12,34,56,78,90])
plt.xticks([0,1,2,3,4], ['1月'.decode('utf-8'),'2月'.decode('utf-8'),'3月'.decode('utf-8'),'4月'.decode('utf-8'),'5月'.decode('utf-8')], rotation=0)
plt.savefig('tmp.png')
plt.close('all')
以上只多了一行,输入2个数组,定制了x轴。第一个数组标记了文本出现的位置,第二个数组是unicode字符串。rotation可以让文字歪过来,在文本过长互相压盖时使用。
4.定制图例
plt.plot( [12,34,56,78,90],label='上月'.decode('utf-8'))
plt.legend(bbox_to_anchor=[0.3, 1])
plt.savefig('tmp.png')
plt.close('all')
画图时加个参数“label”,定义legend之后就会自动出图例。同样只支持unicode字符串。
5.定制标题
plt.plot( [12,34,56,78,90])
plt.title('反馈率'.decode('utf-8'))
plt.savefig('tmp.png')
plt.close('all')
只需要加一句,传入unicode字符串。python默认是unicode,但是写了coding:utf-8之后会把默认编码修改成utf-8,所以这里需要decode回来。
6.定制图片尺寸
fig=plt.gcf()
fig.set_size_inches(10, 5)
plt.plot( [12,34,56,78,90])
plt.savefig('tmp.png')
plt.close('all')
需要在绘制之前,设定图片尺寸,只需要2句。长宽单位是英寸,建议估摸着多试几次找满意的尺寸。
7.图表类型
常用的就 折线图,饼图,条形图;每种图有不同的定制方式。
plt.plot([12,34,56,78,90],color='blue', label='反馈率'.decode('utf-8'),linewidth=5,linestyle='-.')
折线图中,label是图例,color是线颜色,linewidth是线宽,linestyle是线类型
plt.pie([15,23,14,5],explode=[0,0.1,0,0],labels=['a','b','c','d'],colors=['r','b','g','w'],autopct='%1.1f%%',shadow=True,startangle=50)
饼图中,explode是突出显示,label是图例,color是颜色,autopct是占比格式,shadow是阴影,startangle是开始绘制的位置
plt.bar(left=[0,1,2], height=[10,15,20],width=0.3,alpha=0.3, color='b',label='month',edgecolor='#000000',linewidth=2)
条形图比其他图多一个必选输入,需要输入条形长度和条形位置。
8.多子图
也就是在一张图片上,画多个图表。常见的就是上下组合,左右组合,4拼。不建议画更复杂的图。
左右:
plt.figure(12)#先分成左右两块
plt.subplot(121)#绘制第一块
plt.plot([10,15,20])
plt.subplot(122)#绘制第2块
plt.plot([10,15,20])
plt.savefig('tmp.png')
plt.close('all')
上下:
plt.figure(21)#先分成上下两块
plt.subplot(211)#绘制第一块
plt.plot([10,15,20])
plt.subplot(212)#绘制第2块
plt.plot([10,15,20])
plt.savefig('tmp.png')
plt.close('all')
plt.figure(22)#先分成4两块
plt.subplot(221)#绘制第一块
plt.plot([10,15,20])
plt.subplot(222)#绘制第2块
plt.plot([10,15,20])
plt.subplot(223)#绘制第3块
plt.plot([10,15,20])
plt.subplot(224)#绘制第4块
plt.plot([10,15,20])
plt.savefig('tmp.png')
plt.close('all')