近些年来,随着学术界的大佬们在机器学习,深度学习,自然语言处理及数据分析等领域取得一个又一个的突破,Python的地位也不断地被提升,而Matplotlib作为python绘图时常用的一个底层图库,由于其功能强大,得到了众多python使用者的关注。这一章节我们将主要讲解散点图,直方图,折线图,条形图的绘制方法,具体说明如下:
一. 首先在我们讲解具体的绘制过程前,先要了解一下一些常用的绘图参数的设置及用法:
1)pyplot.figure(参数a,参数b,参数c,参数d......),具体解释如下()
def figure(num=None, # autoincrement if None, else integer from 1-N
figsize=None, # defaults to rc figure.figsize
dpi=None, # defaults to rc figure.dpi
facecolor=None, # defaults to rc figure.facecolor
edgecolor=None, # defaults to rc figure.edgecolor
frameon=True,
FigureClass=Figure,
clear=False,
**kwargs
)#来源于python官方文档
用法示例:pyplot.figure(figsize=(20,8),dpi=100,....)#设置图片大小为20*8,dpi为100;
2)pyplot.xticks(参数a,参数b,参数c,参数d......),具体解释如下:主要用于设置x轴的标签,参数a常用来传递数组的长度,参数b常用来对标签重命名,其余参数根据需要填写。pyplot.yticks类似于pyplot.xticks;
3)pyplot.xlabel(“字符串”),对坐标轴的横坐标进行声明,声明内容为字符串的内容,pyplot.ylabel(“字符串”),对坐标轴的横坐标进行声明;
4)pyplot.title(),声明图的标题名称;
5)pyplot.legend(),调用图例;
6)pyplot.grid(),绘制网格,普遍用法:pyplot.grid(alpha=0.9,linestyle='--',color=red);
7)pyplot.plot(x,y),表示绘制折线图;pyplot.scatter(x,y),表示绘制散点图; pyplot.bar(x,y),表示绘制条形图;pyplot.barh(x,y),表示绘制竖着的条形图;pyplot.hist(x,y),表示绘制直方图;需要注意的是绘制直方图时hist传递的第一个参数是数据,第二个参数为分组数
8)pyplot.show(),对绘制的图形进行展示;
9) pyplot.save(),对图片进行保存。
二. 字体配置
注意:由于Matplotlib对中文不能很好地展示,因此会出现乱码的情况,在这里首先要对字体进行配置,配置方法如下:
方法一:
from matplotlib import font_manager
_myfont=font_manager.FontProperties(fname="C:/Windows/Fonts/simhei.ttf")(这是博主的电脑路径下的字体,可以根据需要修改)
方法二:
import matplotlib
_myfont = {'family' : 'monospace', 'weight' : 'bold', 'size' : 'larger'}
matplotlib.rc("_myfont",**font)
这里推荐方法一
三. 图形绘制
1.折线图的绘制
from matplotlib import pyplot,font_manager #调用画图包和字体包
import random
_myfont=font_manager.FontProperties(fname="C:/Windows/Fonts/simhei.ttf")#配置相关的字体
_day=range(0,61) #设置x轴的坐标点数
_datas=[random.randint(0,10) for i in _day]# 对于每一天随机生成相关数据
pyplot.figure(figsize=(15,10),dpi=100) #设置图片的大小及dpi
_xticks_label=["5月%d号"%(i+1) for i in range(31)] #设置x轴标签要显示的内容,方便xticks调用
_xticks_label+=["6月%d号"%(i+1) for i in range(30)]
pyplot.xticks(list(_day)[::1],_xticks_label[::1],rotation=-90,fontproperties=_myfont)#对x轴的内容进行配置,_xticks_label[::1] #在每天list(_day)[::1]的那个点要显示的内容,rotation内容旋转,fontproperties进行字体配置
pyplot.plot(_day,_datas)#绘制图形
pyplot.xlabel("日期",fontproperties=_myfont,labelpad=10)#设置x轴标签的内容
pyplot.ylabel("空气状况",fontproperties=_myfont)#设置y轴标签的内容
pyplot.title("五月-六月每天的空气状况",fontproperties=_myfont) #绘制标题
pyplot.show()
2.在一张图片上显示两个图
from matplotlib import pyplot,font_manager #调用画图包和字体包
import random
_myfont=font_manager.FontProperties(fname="C:/Windows/Fonts/simhei.ttf")#配置相关的字体
_day5=range(0,31) #设置天数
_day6=range(61,91)
_datas5=[random.randint(0,5) for i in _day5]# 对于每一天随机生成相关数据
_datas6=[random.randint(0,5) for i in _day6]# 对于每一天随机生成相关数据
_days=list(_day5)+list(_day6)
pyplot.figure(figsize=(15,10),dpi=100) #设置图片的大小及dpi
_xticks_label=["5月%d号"%(i+1) for i in _day5] #设置x轴标签要显示的内容,方便xticks调用
_xticks_label+=["6月%d号"%(i-60) for i in _day6]
pyplot.plot(_day5,_datas5)#绘制图形
pyplot.plot(_day6,_datas6)
pyplot.xticks(list(_days)[::1],_xticks_label[::1],rotation=-90,fontproperties=_myfont)#对x轴的内容进行配置,_xticks_label[::1]在每天list(_days)[::1]的那个点要显示的内容,
# rotation内容旋转,fontproperties进行字体配置
pyplot.xlabel("日期",fontproperties=_myfont,labelpad=10)#设置x轴标签的内容
pyplot.ylabel("空气状况",fontproperties=_myfont)#设置y轴标签的内容
pyplot.title("五月-六月每天的空气状况",fontproperties=_myfont) #绘制标题
pyplot.grid(alpha=0.5)
pyplot.show()
结果:
3.绘制散点图
基本使用方式同1,只需要把绘图命令改成pyplot.scatter(_day,_datas)
4.绘制条形图
基本使用方式同1,只需要把绘图命令改成pyplot.bar(_day,_datas,width=0.2)#width设置条形图的宽度
5.绘制直方图
基本使用方式同1,只需要把绘图命令改成pyplot.hists(_day,_datas)#width设置条形图的宽度
但是要注意:绘制条形图时往往需要事先给定每个条的间隔bar_width,然后求所分的组数(num=(max-min)//barh_width)
但是这样处理后往往由于分配不均,而是的matplotlib绘制的图像出现错位的情况,最好的解决方法就是进行强制调整。例子展示如下
如果直接绘制会出现如下情况
from matplotlib import pyplot,font_manager
_myfont=font_manager.FontProperties(fname="C:/Windows/Fonts/simhei.ttf")
a=[11, 18, 15, 11, 24, 13, 31, 27, 8, 11, 2, 13, 40,4, 55, 1, 2, 4, 14]
bar_width=4;#设置组距
num=(max(a)-min(a))//bar_width#求分组数
pyplot.hist(a,num,normed=1)
pyplot.xticks(range(min(a),max(a)+bar_width,bar_width))
pyplot.grid()
pyplot.show()
因此需要对代hist()函数中的第二个参数进行修改
from matplotlib import pyplot,font_manager
_myfont=font_manager.FontProperties(fname="C:/Windows/Fonts/simhei.ttf")
a=[11, 18, 15, 11, 24, 13, 31, 27, 8, 11, 2, 13, 40,4, 55, 1, 2, 4, 14]
bar_width=4;#设置组距
num=(max(a)-min(a))//bar_width#求分组数
pyplot.hist(a,[min(a)+bar_width*i for i in range(num)],normed=1)#hist的第二个参数传递的是组距,可以是数组
pyplot.xticks(range(min(a),max(a)+bar_width,bar_width))
pyplot.grid()
pyplot.show()