本节介绍常用图表的绘制,主要包括绘制折线图、绘制柱形图、绘制直方图、绘制饼形图、绘制散点图、绘制面积图、绘制热力图、绘制箱形图、绘制3D图表、绘制多个子图表以及图表的保存。
目录
一、折线图
折线图可以显示随时间而变化的连续数据,因此非常适用于显示在相等时间间隔下数据的趋势。如基础体温曲线图、学生成绩走势图、股票月成交量走势图,月销售统计分析图、微博、公众号、网站访问量统计图等都可以用折线图体现。在折线图中,类别数据沿水平轴均匀分布,所有值数据沿垂直轴均匀分布。Matplotlib绘制折线图主要使用plot()函数。
例如,使用plot()函数绘制多折线图。下面以绘制学生语数外各科成绩分析图为例,程序代码如下:
df1=pd.read_excel(r'C:\Users\zex\Desktop\MR\Code\05\12\data.xls')
x1=df1['姓名']
y1=df1['语文']
y2=df1['数学']
y3=df1['英语']
plt.rcParams['font.sans-serif']=['SimHei']#解决中文乱码问题
plt.rcParams['xtick.direction']='out'
plt.rcParams['ytick.direction']='in'
plt.title('语数外成绩',fontsize='18')
plt.plot(x1,y1,label="语文",color='r',marker='p')#图例标签'语文';线条颜色:红色;数据点样式:实心五角星标记
plt.plot(x1,y2,label='数学',color='g',marker='.',mfc='r',ms=8,alpha=0.7)
plt.plot(x1,y3,label='英语',color='b',linestyle='-',marker='*')#图例标签'英语';线条颜色:蓝色;数据点样式:星形标记
plt.legend(['语文','数学','英语'])
plt.show()
color:设置折线的颜色
linestyle:设置折线的线型
marker:设置数据点的样式
label:设置该条折线的图例标签(设置自动图例时显示)
mfc:标记的颜色。
ms:标记的大小。
mec:标记边框的颜色。
alpha:透明度,设置该参数可以改变颜色的深浅。
二、柱形图
柱形图,又称长条图、柱状图、条状图等,是一种以长方形的长度为变量的统计图表。柱形图用来比较两个或两个以上的数据(不同时间或者不同条件),只有一个变量,通常用于较小的数据集分析。
Matplotlib绘制柱形图主要使用bar()函数,语法如下:
matplotlib.pyplot.bar(x,height,width,bottom=None,*,align='center',data=None,**kwargs)
- x:x轴数据。
- height:柱子的高度,也就是y轴数据。
- width:浮点型,柱子的宽度,默认值为0.8,可以指定固定值。
- bottom:标量或数组,可选参数,柱形图的y坐标,默认值为None。
- *:星号本身不是参数。星号表示其后面的参数为命名关键字参数,命名关键字参数必须传入参数名;否则程序会出现错误。
- align:对齐方式,如center(居中)和edge(边缘),默认值为center。
- data:data关键字参数。如果给定一个数据参数,所有位置和关键字参数将被替换。
- **kwargs:关键字参数,其他可选参数,如color(颜色)、alpha(透明度)、label(每个柱子显示的标签)等。
例如,绘制简单的柱形图,程序代码如下:
x=[1,2,3,4,5,6]
y=[9,18,27,36,45,54]
plt.bar(x=x,height=y)
plt.show()
再例如,使用bar()函数绘制“2013—2019年线上图书销售额分析图”,程序代码如下:
plt.rcParams['font.sans-serif']=['SimHei']
df=pd.read_excel(r'C:\Users\zex\Desktop\MR\Code\05\15\books.xlsx')
x=df['年份']
height=df['销售额']
print(height)
plt.grid(axis='y',which='major')#生成虚线网格
plt.xlabel('年份')
plt.ylabel('年销售额(元)')
plt.title('2013—2019年线上图书销售额分析图')
plt.bar(x,height,width=0.5,align='center',color='r',alpha=0.5)
for a,b in zip(x,height):
plt.text(a,b,format(b,','),ha='center',va='bottom',fontsize=9,color='b',alpha=0.9)
plt.legend(('销售额',))
plt.show()
本示例应用了前面所学习的知识,例如标题、图例、文本标签和坐标轴标签等。
对于线上图书销售额的统计,如果要统计各个平台的销售额,可以使用多柱形图,不同颜色的柱子代表不同的平台,如京东、天猫、自营等,程序代码如下:
plt.rcParams['font.sans-serif']=['SimHei']
df=pd.read_excel(r'C:\Users\zex\Desktop\MR\Code\05\15\books.xlsx',sheet_name='Sheet2')
x=df['年份']
y1=df['京东']
y2=df['天猫']
y3=df['自营']
width=0.25
plt.grid(axis='y',which='major')#生成虚线网格
plt.xlabel('年份')
plt.ylabel('年销售额(元)')
plt.title('2013—2019年线上图书销售额分析图')
plt.bar(x,y1,width=width,color='darkorange')
plt.bar(x+width,y2,width=width,color='deepskyblue')
plt.bar(x+2*width,y3,width=width,color='g')
for a,b in zip(x,y1):
plt.text(a,b,format(b,','),ha='center',va='bottom',fontsize=8)
for a,b in zip(x,y2):
plt.text(a+width,b,format(b,','),ha='center',va='bottom',fontsize=8)
for a,b in zip(x,y3):
plt.text(a+2*width,b,format(b,','),ha='center',va='bottom',fontsize=8)
plt.legend(['京东','天猫','自营'])
plt.show()
注意:柱形图中若显示n个柱子,则柱子宽度值需小于1/n;否则柱子会出现重叠现象。
三、直方图
直方图,又称质量分布图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据类型,纵轴表示分布情况。直方图是数值数据分布的精确图形表示,是一个连续变量(定量变量)的概率分布的估计。
绘制直方图主要使用hist()函数,语法如下:
matplotlib.pyplot.hist(x,bins=None,range=None, density=None, bottom=None, histtype='bar', align='mid', log=
False, color=None, label=None, stacked=False, normed=None)
- x:数据集,最终的直方图将对数据集进行统计。
- bins:统计数据的区间分布。
- range:元组类型,显示的区间。
- density:布尔型,显示频率统计结果,默认值为None。设置值为False,不显示频率统计结果;设置值为True,则显示频率统计结果。需要注意,频率统计结果=区间数目/(总数×区间宽度)。
- histtype:可选参数,设置值为bar、barstacked、step或stepfilled,默认值为bar,推荐使用默认配置,其中step使用的是梯状,stepfilled则会对梯状内部进行填充,效果与bar类似。
- align:可选参数,控制柱状图的水平分布,设置值为left、mid或right,默认值为mid,其中,left或者right会有部分空白区域,推荐使用默认值。
- log:布尔型,默认值为False,即y坐标轴是否选择指数刻度。
- stacked:布尔型,默认值为False,是否为堆积柱状图。
例如,通过直方图分析学生数学成绩分布情况,程序代码如下:
plt.rcParams['font.sans-serif']=['SimHei']
df=pd.read_excel(r'C:\Users\zex\Desktop\MR\Code\05\17\grade1.xls')
x=df['得分']
plt.xlabel('分数')
plt.ylabel('学生数量')
plt.title('数学分数分布直方图')
plt.hist(x,bins=[0,25,50,75,100,125,150],facecolor='blue',edgecolor='black',alpha=0.8)
plt.show()
四、饼形图
饼形图常用来显示各个部分在整体中所占的比例。例如,在工作中如果遇到需要计算总费用或金额的各个部分构成比例的情况,一般通过各个部分与总额相除来计算,而且这种比例表示方法很抽象,而通过饼形图将直接显示各个组成部分所占比例,一目了然。
Matplotlib绘制饼形图主要使用pie()函数,语法如下:
matplotlib.pyplot.pie(x,explode=None,labels=None,colors=None,autopct=None,pctdistance=0.6,shadow=False,
labeldistance=1.1,startangle=None,radius=None,counterclock=True,wedgeprops=None,textprops=None,center=
(0, 0), frame=False, rotatelabels=False, hold=None, data=None)
- x:每一块饼图的比例,如果sum(x)>1会使用sum(x)归一化。
- explode:每一块饼图离中心的距离。
- labels:每一块饼图外侧显示的说明文字。
- autopct:设置饼图百分比,可以使用格式化字符串或format()函数。如'%1.1f '保留小数点前后1位。
- pctdistance:类似于labeldistance参数,指定百分比的位置刻度,默认值为0.6。
- shadow:在饼图下面画一个阴影,默认值为False,即不画阴影。
- labeldistance:标记的绘制位置,相对于半径的比例,默认值为1.1,如<1则绘制在饼图内侧。
- startangle:起始绘制角度,默认是从x轴正方向逆时针画起,如设置值为90则从y轴正方向画起。
- radius:饼图半径,默认值为1。
- counterclock:指定指针方向,布尔型,可选参数。默认值为True,表示逆时针;如果值为False,则表示顺时针。
- wedgeprops:字典类型,可选参数,默认值为None。字典传递给wedge对象,用来画一个饼图。例如wedgeprops={'linewidth':2}设置wedge线宽为2。
- textprops:设置标签和比例文字的格式,字典类型,可选参数,默认值为None。传递给text对象的字典参数。
- center:浮点类型的列表,可选参数,默认值为(0,0),表示图表中心位置。
- frame:布尔型,可选参数,默认值为False,不显示轴框架(也就是网格);如果值为True,则显示轴框架,与grid()函数配合使用。实际应用中建议使用默认设置,因为显示轴框架会干扰饼形图效果。
- rotatelabels:布尔型,可选参数,默认值为False;如果值为True,则旋转每个标签到指定的角度。
例如,绘制简单饼形图,程序代码如下:
x=[9,10,11,35,15,20]
plt.pie(x,autopct='%1.1f%%')
plt.show()
饼形图也存在各种类型,主要包括基础饼形图、分裂饼形图、立体感带阴影的饼形图、环形图等。下面分别进行介绍。
1.基础饼形图
例如,通过饼形图分析2020年1月各地区销量占比情况,程序代码如下:
df1=pd.read_excel(r'C:\Users\zex\Desktop\MR\Code\05\19\data2.xls')
plt.rcParams['font.sans-serif']=['SimHei']
plt.figure(figsize=(5,3))
labels=df1['地区']
sizes=df1['销量']
#设置饼形图每一块的颜色
colors=['red','yellow','slateblue','green','magenta','cyan','darkorange','lawngreen','pink','gold']
plt.pie(sizes,#绘图数据
labels=labels,#添加区域水平标签
colors=colors,#设置饼图填充色
labeldistance=1.02,#设置各扇形标签与圆心的距离
autopct='%.1f%%',#设置百分比的格式,这里保留一位小数
startangle=90,#设置饼图的初始角度
radius=0.5,#设置饼图的半径
center=(0.2,0.2),#设置饼图的原点
textprops={'fontsize':9,'color':'k'},#设置文本标签的属性值
pctdistance=0.6#设置百分比标签与圆心的距离
)
plt.axis('equal')#
plt.title('2020年1月各地区销量占比情况')
plt.show()
2.分裂饼形图
分裂饼形图是将您认为主要的饼图部分分裂出来,以达到突出显示的目的。分裂饼形图主要通过设置explode参数实现,该参数用于设置饼图距中心的距离,我们需要将哪块饼图分裂出来,就设置它与中心的距离即可。例如,上图有10块饼图,我们将占比最多的“广东省”分裂出来。广东省在第一位,那么就设置第一位距中心的距离为0.1,其他为0,关键代码如下:
explode = (0.1,0,0,0,0,0,0,0,0,0)
df1=pd.read_excel(r'C:\Users\zex\Desktop\MR\Code\05\19\data2.xls')
plt.rcParams['font.sans-serif']=['SimHei']
plt.figure(figsize=(5,3))
labels=df1['地区']
sizes=df1['销量']
#设置饼形图每一块的颜色
colors=['red','yellow','slateblue','green','magenta','cyan','darkorange','lawngreen','pink','gold']
plt.pie(sizes,#绘图数据
labels=labels,#添加区域水平标签
colors=colors,#设置饼图填充色
labeldistance=1.02,#设置各扇形标签与圆心的距离
autopct='%.1f%%',#设置百分比的格式,这里保留一位小数
startangle=90,#设置饼图的初始角度
radius=0.5,#设置饼图的半径
center=(0.2,0.2),#设置饼图的原点
textprops={'fontsize':9,'color':'k'},#设置文本标签的属性值
pctdistance=0.6,#设置百分比标签与圆心的距离
explode=(0.1,0,0,0,0,0,0,0,0,0)
)
plt.axis('equal')#
plt.title('2020年1月各地区销量占比情况')
plt.show()
3.立体感带阴影的饼形图
立体感带阴影的饼形图主要通过shadow参数实现,设置该参数值为True即可,主要代码如下:
df1=pd.read_excel(r'C:\Users\zex\Desktop\MR\Code\05\19\data2.xls')
plt.rcParams['font.sans-serif']=['SimHei']
plt.figure(figsize=(5,3))
labels=df1['地区']
sizes=df1['销量']
#设置饼形图每一块的颜色
colors=['red','yellow','slateblue','green','magenta','cyan','darkorange','lawngreen','pink','gold']
plt.pie(sizes,#绘图数据
labels=labels,#添加区域水平标签
colors=colors,#设置饼图填充色
labeldistance=1.02,#设置各扇形标签与圆心的距离
autopct='%.1f%%',#设置百分比的格式,这里保留一位小数
startangle=90,#设置饼图的初始角度
radius=0.5,#设置饼图的半径
center=(0.2,0.2),#设置饼图的原点
textprops={'fontsize':9,'color':'k'},#设置文本标签的属性值
pctdistance=0.6,#设置百分比标签与圆心的距离
explode=(0.1,0,0,0,0,0,0,0,0,0),
shadow=True
)
plt.axis('equal')#
plt.title('2020年1月各地区销量占比情况')
plt.show()
4.环形图
环形图是由两个及两个以上大小不一的饼图叠在一起,挖去中间的部分所构成的图形,这里还是通过pie()函数实现,一个关键参数wedgeprops,字典类型,用于设置饼形图内、外边界的属性,如环的宽度,环边界颜色和宽度,主要代码如下:
df1=pd.read_excel(r'C:\Users\zex\Desktop\MR\Code\05\19\data2.xls')
plt.rcParams['font.sans-serif']=['SimHei']
plt.figure(figsize=(5,3))
labels=df1['地区']
sizes=df1['销量']
#设置饼形图每一块的颜色
colors=['red','yellow','slateblue','green','magenta','cyan','darkorange','lawngreen','pink','gold']
plt.pie(sizes,#绘图数据
labels=labels,#添加区域水平标签
colors=colors,#设置饼图填充色
labeldistance=1.02,#设置各扇形标签与圆心的距离
autopct='%.1f%%',#设置百分比的格式,这里保留一位小数
startangle=90,#设置饼图的初始角度
radius=0.5,#设置饼图的半径
center=(0.2,0.2),#设置饼图的原点
textprops={'fontsize':9,'color':'k'},#设置文本标签的属性值
pctdistance=0.6,#设置百分比标签与圆心的距离
# explode=(0.1,0,0,0,0,0,0,0,0,0),
# shadow=True,
wedgeprops={'width':0.2,'edgecolor':'k'}
)
plt.axis('equal')#
plt.title('2020年1月各地区销量占比情况')
plt.show()
5.内嵌环形图
内嵌环形图实际是双环形图,绘制内嵌环形图需要注意以下3点:(1)连续使用两次pie()函数。(2)通过wedgeprops参数设置环形边界。(3)通过radius参数设置不同的半径。另外,由于图例内容比较长,为了使图例能够正常显示,图例代码中引入了两个主要参数,即frameon和bbox_to_anchor。其中,frameon参数设置图例有无边框;bbox_to_anchor参数设置图例位置,主要代码如下:
plt.rcParams['font.sans-serif']=['SimHei']
df1=pd.read_excel(r'C:\Users\zex\Desktop\MR\Code\05\22\data2.xls')
df2=pd.read_excel(r'C:\Users\zex\Desktop\MR\Code\05\22\data2.xls',sheet_name='2月')
x1=df1['销量']
x2=df2['销量']
colors = ['red', 'yellow', 'slateblue', 'green','magenta','cyan','darkorange','lawngreen','pink','gold']
#外环
plt.pie(x1,autopct='%.1f%%',radius=1,pctdistance=0.85,colors=colors,wedgeprops=dict(linewidth=2,width=0.3,edgecolor='w'))
#内环
plt.pie(x2,autopct='%.1f%%',radius=0.7,pctdistance=0.7,colors=colors,wedgeprops=dict(linewidth=2,width=0.4,edgecolor='w'))
#图例
legend_text=df1['地区']
plt.legend(legend_text,title='地区',frameon=False,bbox_to_anchor=(0.2,0.5))#设置图例标题、位置、去掉图例边框
plt.axis('equal')#设置坐标轴比例以显示为圆形
plt.title('2020年1月和2月各地区销量占比情况分析')
plt.show()
五、散点图
散点图主要用来查看数据的分布情况或相关性,一般用在线性回归分析中,查看数据点在坐标系平面上的分布情况。散点图表示因变量随自变量而变化的大致趋势,据此可以选择合适的函数对数据点进行拟合。散点图与折线图类似,也是一个个点构成的。但不同之处在于,散点图的各点之间不会按照前后关系以线条连接起来。Matplotlib绘制散点图使用plot()函数和scatter()函数都可以实现,本节使用scatter()函数绘制散点图,scatter()函数专门用于绘制散点图,使用方式和plot()函数类似,区别在于前者具有更高的灵活性,可以单独控制每个散点与数据匹配,并让每个散点具有不同的属性。scatter()函数的语法如下:
matplotlib.pyplot.scatter(x,y,s=None,c=None,marker=None,
cmap=None,norm=None,vmin=None,vmax=None,
alpha=None,linewidths=None,verts=None,
edgecolors=None,data=None, **kwargs)
- x,y:数据。
- s:标记大小,以平方磅为单位的标记面积,设置值如下。
- 数值标量:以相同的大小绘制所有标记
- 行或列向量:使每个标记具有不同的大小。x、y和sz中的相应元素确定每个标记的位置和面积。sz的长度必须等于x和y的长度。
- []:使用36平方磅的默认面积。
- c:标记颜色,可选参数,默认标记颜色为蓝色。
- marker:标记样式,可选参数,默认值为'o'。
- cmap:颜色地图,可选参数,默认值为None。
- norm:可选参数,默认值为None
- vmin,vmax:标量,可选,默认值为None
- alpha:透明度,可选参数,0~1的数,表示透明度,默认值为None。
- linewidths:线宽,标记边缘的宽度,可选参数,默认值为None。
- verts:(x,y)的序列,可选参数,如果参数marker为None,这些顶点将用于构建标记。标记的中心位置为(0,0)。
- edgecolors:轮廓颜色,与参数c类似,可选参数,默认值为None。
- data:data关键字参数。如果给定一个数据参数,所有位置和关键字参数将被替换。
- **kwargs:关键字参数,其他可选参数。
例如,绘制销售收入与广告费散点图,用以观察销售收入与广告费的相关性,主要代码如下:
df_a=pd.DataFrame(pd.read_excel(r'C:\Users\zex\Desktop\MR\Code\05\24\JDdata.xls'))
df_b=pd.DataFrame(pd.read_excel(r'C:\Users\zex\Desktop\MR\Code\05\24\JDcar.xls'))
df1=df_a[['业务日期','金额']]
df2=df_b[['投放日期','支出']]
df1=df1[df1['业务日期'].notnull() & df1['金额']!=0]
df2=df2[df2['投放日期'].notnull() & df2['支出']!=0]
df1['业务日期']=pd.to_datetime(df1['业务日期'])
df2['投放日期']=pd.to_datetime(df2['投放日期'])
dfData=df1.set_index('业务日期',drop=True)
dfCar=df2.set_index('投放日期',drop=True)
#按照月度统计并显示销售金额
dfData_month=dfData.resample('M').sum().to_period('M')
dfCar_month=dfCar.resample('M').sum().to_period('M')
x=pd.DataFrame(dfCar_month['支出'])
y=pd.DataFrame(dfData_month['金额'])
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
plt.title('销售收入与广告费散点图') #图表标题
plt.scatter(x,y,color='red')
plt.show()
六、面积图
面积图用于体现数量随时间而变化的程度,也可用于引起人们对总值趋势的注意。例如,表示随时间而变化的利润的数据可以绘制在面积图中,以强调总利润。
Matplotlib绘制面积图主要使用stackplot()函数,语法如下:
matplotlib.pyplot.stackplot(x,*args,data=None,**kwargs)
- x:x轴数据。
- *args:当传入的参数个数未知时使用*args。这里指y轴数据可以传入多个y轴。
- data:data关键字参数。如果给定一个数据参数,所有位置和关键字参数将被替换
- **kwargs:关键字参数,其他可选参数,如color(颜色)、alpha(透明度)等。
例如,绘制简单面积图,程序代码如下:
x=[1,2,3,4,5]
y1=[12,9,7,13,2]
y2=[9,1,4,21,2]
y3=[3,5,15,10,7]
plt.stackplot(x,y1,y2,y3,colors=['r','g','b','c'])
plt.show()
面积图也有很多种,如标准面积图、堆叠面积图和百分比堆叠面积图等。下面主要介绍标准面积图和堆叠面积图。
1.标准面积图
通过标准面积图分析2013—2019年线上图书销售情况,通过该图可以看出每一年线上图书销售的一个趋势,效果如下图所示:
df=pd.read_excel(r'C:\Users\zex\Desktop\MR\Code\05\26\books.xlsx')
plt.rcParams['font.sans-serif']=['SimHei']
x=df['年份']
y=df['销售额']
plt.title('2013-2019线上图书销售情况')
plt.stackplot(x,y)
plt.show()
2.堆叠面积图
通过堆叠面积图分析2013—2019年线上各平台图书销售情况。堆叠面积图不仅可以看到各平台每年销售变化趋势,通过将各平台数据堆叠到一起还可以看到整体的变化趋势。实现堆叠面积图的关键在于增加y轴,通过增加多个y轴数据,形成堆叠面积图,主要代码如下:
df=pd.read_excel(r'C:\Users\zex\Desktop\MR\Code\05\26\books.xlsx',sheet_name='Sheet2')
plt.rcParams['font.sans-serif']=['SimHei']
x=df['年份']
y1=df['京东']
y2=df['天猫']
y3=df['自营']
plt.title('2013-2019线上图书销售情况')
plt.stackplot(x,y1,y2,y3,colors=['r','g','b'])
plt.legend(['京东','天猫','自营'],loc='upper left')
plt.show()
七、热力图
热力图是通过密度函数进行可视化用于表示地图中点的密度的热图。它使人们能够独立于缩放因子感知点的密度。热力图可以显示不可点击区域发生的事情。利用热力图可以看数据表里多个特征两两的相似度。例如,以特殊高亮的形式显示访客热衷的页面区域和访客所在的地理区域的图示。热力图在网页分析、业务数据分析等其他领域也有较为广泛的应用。
热力图是数据分析的常用方法,通过色差、亮度来展示数据的差异,易于理解。下面绘制简单热力图,程序代码如下:
import matplotlib.pyplot as plt
X = [[1,2],[3,4],[5,6],[7,8],[9,10]]
plt.imshow(X)
上述代码中,plt.imshow(X)中传入的数组X=[[1,2],[3,4],[5,6],[7,8],[9,10]]为颜色的对应值,按照矩阵X进行颜色分布,如左上角颜色为深蓝,其对应值为1,右下角颜色为黄色,其对应值为10,具体如下:
[1,2] [深蓝,蓝色]
[3,4] [蓝绿,深绿]
[5,6] [海藻绿,春绿色]
[7,8] [绿色,浅绿色]
[9,10] [草绿色,黄色]
例如,根据学生成绩统计数据绘制热力图,通过热力图可清晰直观地对比每名学生各科成绩的高低。程序代码如下:
df=pd.read_excel(r'C:\Users\zex\Desktop\MR\Code\05\29\data1.xls',sheet_name='高二一班')
plt.rcParams['font.sans-serif']=['SimHei']
x=df.loc[:,'语文':'生物'].values
name=df['姓名']
plt.imshow(x)
plt.xticks(range(0,6,1),['语文','数学','英语','物理','化学','生物'])#设置x轴刻度标签
plt.yticks(range(0,12,1),name)#设置y轴刻度标签
plt.colorbar()#显示颜色条
plt.title('学生成绩统计热力图')
plt.show()
从上图中可以看到,颜色以高亮显示的,成绩越高;反之,成绩越低。
八、箱型图
箱形图又称箱线图、盒须图或盒式图,它是一种用作显示一组数据分散情况下的资料的统计图。因形状像箱子而得名。箱形图最大的优点就是不受异常值的影响(异常值也称为离群值),可以以一种相对稳定的方式描述数据的离散分布情况,因此在各种领域也经常被使用。另外,箱形图也常用于异常值的识别。Matplotlib绘制箱形图主要使用boxplot()函数,语法如下:
matplotlib.pyplot.boxplot(x,notch=None,sym=None,vert=None,
whis=None,positions=None,widths=None,patch_
artist=None,meanline=None,showmeans=None,showcaps=None,
showbox=None,showfliers=None,boxprops=None,
labels=None,flierprops=None,medianprops=None,
meanprops=None,capprops=None,whiskerprops=None)
- x:指定要绘制箱形图的数据。
- notch:是否以凹口的形式展现箱形图,默认非凹口。
- sym:指定异常点的形状,默认为加号(+)显示。
- vert:是否需要将箱形图垂直摆放,默认垂直摆放。
- whis:指定上下限与上下四分位的距离,默认为1.5倍的四分位差。
- positions:指定箱形图的位置,默认为[0,1,2,…]。
- widths:指定箱形图的宽度,默认为0.5。
- patch_artist:是否填充箱体的颜色。
- meanline:是否用线的形式表示均值,默认用点来表示。
- showmeans:是否显示均值,默认不显示。
- showcaps:是否显示箱形图顶端和末端的两条线,默认显示。
- showbox:是否显示箱形图的箱体,默认显示。
- showfliers:是否显示异常值,默认显示。
- boxprops:设置箱体的属性,如边框色、填充色等。
- labels:为箱形图添加标签,类似于图例的作用。
- filerprops:设置异常值的属性,如异常点的形状、大小、填充色等。
- medianprops:设置中位数的属性,如线的类型、粗细等。
- meanprops:设置均值的属性,如点的大小、颜色等。
- capprops:设置箱形图顶端和末端线条的属性,如颜色、粗细等。
- whiskerprops:设置须的属性,如颜色、粗细、线的类型等。
例如,绘制简单箱形图,程序代码如下:
x=[1,3,5,7,9]
plt.boxplot(x)
plt.show()
上述举例是一组数据的箱形图,还可以绘制多组数据的箱形图,需要指定多组数据。例如,为三组数据绘制箱形图,程序代码如下:
x1=[1,3,5,7,9]
x2=[7,16,18,20,11]
x3=[23,19,9,3,27]
plt.boxplot([x1,x2,x3])
plt.show()
箱形图将数据切割分离(实际上就是将数据分为4大部分),如下图所示:
下面介绍箱形图每部分具体含义以及如何通过箱形图识别异常值。
- 下四分位数指的是数据的25%分位点所对应的值(Q1)。计算分位数可以使用Pandas的quantile()函数。
- 中位数中位数即为数据的50%分位点所对应的值(Q2)。
- 上四分位数上四分位数则为数据的75%分位点所对应的值(Q3)。
- 上限的计算公式为Q3+1.5(Q3-Q1)。
- 下限的计算公式为Q1-1.5(Q3-Q1)。
其中,Q3-Q1表示四分位差。如果使用箱形图识别异常值,其判断标准是,当变量的数据值大于箱形图的上限或者小于箱线图的下限时,就可以将这样的数据判定为异常值。
下面了解一下判断异常值的算法。
通过箱形图查找客人总消费数据中存在的异常值,程序代码如下:
df=pd.read_excel(r'C:\Users\zex\Desktop\MR\Code\05\32\tips.xlsx')
plt.boxplot(
x=df['总消费'],#箱型图的数据
whis=1.5,#指定1.5倍的四分位差
widths=0.3,#指定箱线图中箱子的宽度为0.3
patch_artist=True,#填充箱子的颜色
showmeans=True,#显示均值
boxprops={'facecolor':'RoyalBlue'},#指定箱子的颜色为宝石蓝
#指定异常值的填充色、边框色、大小
flierprops={'markerfacecolor':'red','markeredgecolor':'red','markersize':3},
#指定中位数的标记符号(虚线)和颜色
meanprops={'markerfacecolor':'black','markersize':8,'marker':'h'},
#指定均值的符号标记(六边形)、填充色和大小
medianprops={'linestyle':'--','color':'orange'},
labels=[''],#去除x轴刻度值
)
#计算上四分位和下四分位
Q1=df['总消费'].quantile(q=0.25)
Q3=df['总消费'].quantile(q=0.75)
#基于1.5倍的四分位差计算上下限对应的值
low_limit= Q1-1.5*(Q3-Q1)
up_limit=Q3+1.5*(Q3-Q1)
#查找异常值
val=df['总消费'][(df["总消费"]>up_limit)|(df['总消费']<low_limit)]
print("异常值如下:")
print(val)
plt.show()
九、绘制多个图表
Matplotlib可以实现在一张图上绘制多个子图表。Matplotlib提供了3种方法:一是subplot()函数;二是subplots()函数;三是add_subplot()函数,下面分别介绍。
1.subplot()函数
subplot()函数直接指定划分方式和位置,它可以将一个绘图区域划分为n个子图,每个subplot()函数只能绘制一个子图。语法如下:
matplotlib.pyplot.subplot(*args,**kwargs)
- args:当传入的参数个数未知时使用*args。
- **kwargs:关键字参数,其他可选参数。例如,绘制一个2×3的区域,subplot(2,3,3),将画布分成2行3列在第3个区域中绘制,用坐标表示如下:
例如,绘制一个2×3的区域,subplot(2,3,3),将画布分成2行3列在第3个区域中绘制,用坐标表示如下:
(1,1),(1,2),(1,3) (2,1),(2,2),(2,3)
例如,绘制一个2×2包含4个子图的空图表,程序代码如下:
plt.subplot(2,2,1)
plt.subplot(2,2,2)
plt.subplot(2,2,3)
plt.subplot(2,2,4)
plt.show()
通过上述举例了解了subplot()函数的基本用法,接下来将前面所学的简单图表整合到一张图表上。
plt.subplot(2,2,1)
#第一个子图表---折线图
plt.plot([1,2,3,4,5])
plt.subplot(2,2,2)
#第二个子图表---散点图
plt.plot([1,2,3,4,5],[13,52,14,29,19],'ro')
plt.subplot(2,1,2)
#第二个子图表---柱形图
x=[1,2,3,4,5,6]
height=[10,23,14,45,13,53]
plt.bar(x,height)
plt.show()
上述举例,以下两个关键点一定要掌握。
(1)每绘制一个子图表都要调用一次subplot()函数。
(2)绘图区域位置编号。subplot()函数的前面两个参数指定的是一个画布被分割成的行数和列数,后面一个参数则指的是当前绘制区域位置编号,编号规则是行优先。
例如,上图中有3个子图表,第1个子图表subplot(2,2,1),即将画布分成2行2列,在第1个子图中绘制折线图;第2个子图表subplot(2,2,2),将画布分成2行2列,在第2个子图中绘制散点图;第3个子图表subplot(2,1,2),将画布分成2行1列,由于第1行已经占用了,所以在第2行也就是第3个子图中绘制柱形图。示意图如下图
subplot()函数在画布中绘图时,每次都要调用它指定绘图区域非常麻烦,而subplots()函数则更直接,它会事先把画布区域分割好。下面介绍subplots()函数。
2.subplots()函数
matplotlib.pyplot.subplots(nrows,ncols,sharex,sharey,
squeeze,subplot_kw,gridspec_kw,**fig_kw)
- nrows和ncols:表示将画布分割成几行几列,例如,nrows=2、ncols=2表示将画布分割为2行2列,起始值均为0。当调用画布中的坐标轴时,ax[0,0]表示调用左上角的坐标,ax[1,1]表示调用右下角的坐标。
- sharex和sharey:布尔值或者值为“none”“all”“row”“col”,默认值为False。用于控制x或y轴之间的属性共享。具体参数值说明如下。
- True或者“all”:表示x或y轴属性在所有子图中共享。
- False或者“none”:表示每个子图的x或y轴都是独立的部分。
- “row”:表示每个子图在一个x或y轴上共享行(row)。
- “col”:表示每个子图在一个x或y轴上共享列(column)
- squeeze:布尔值,默认值为True,额外的维度从返回的axes(轴)对象中挤出,对于n×1或1×n个子图,返回一个一维数组,对于n×m,n>1和m>1返回一个二维数组;如果值为False,则表示不进行挤压操作,返回一个元素为Axes实例的二维数组,即使它最终是1×1。
- subplot_kw:字典类型,可选参数。把字典的关键字传递给add_subplot()函数来创建每个子图。
- gridspec_kw:字典类型,可选参数。把字典的关键字传递给GridSpec()构造函数创建网格区域,然后将子图放在网格(grid)里。
- **fig_kw:把所有详细的关键字参数传递给figure。
绘制一个2×3包含6个子图的空图表,使用subplots()函数只需3行代码。
fig,axes=plt.subplots(2,3)
plt.show()
上述代码中,figure和axes是两个关键点。
figure:绘制图表的画布。
axes:坐标轴对象,可以理解为在figure(画布)上绘制坐标轴对象,它帮我们规划出了一个个科学作图的坐标轴系统。通过下图的示意图可以明白,外面的是画布(figure),里面带坐标轴的是坐标轴对象(axes)。
例如,使用subplots()函数将前面所学的简单图表整合到一张图表上,结果如下图:
fig,axes=plt.subplots(2,2)
axes[0,0].plot([1,2,3,4,5])#第一个子图---折线图
axes[0,1].plot([1,2,3,4,5],[12,42,5,13,24],'ro')#第二个子图---散点图
x=[1,2,3,4,5,6]
height=[10,21,23,52,12,53]
axes[1,0].bar(x,height)#第三个子图---柱形图
x=[22,14,6,32,26]
axes[1,1].pie(x,autopct='%.1f%%')
plt.show()
3、add_subplot()函数
add_subplot()函数也可以实现在一张图上绘制多个子图表,用法与subplot()函数基本相同,先来看下列一段代码:
fig = plt.figure()
ax1 = fig.add_subplot(2,3,1)
ax2 = fig.add_subplot(2,3,2)
ax3 = fig.add_subplot(2,3,3)
ax4 = fig.add_subplot(2,3,4)
ax5 = fig.add_subplot(2,3,5)
ax6 = fig.add_subplot(2,3,6)
plt.show()
上述代码同样是绘制一个2×3包含6个子图的空图表。首先创建figure实例(画布),然后通过ax1 =fig.add_subplot(2,3,1)创建第1个子图表,返回Axes实例(坐标轴对象),第1个参数为行数,第2个参数为列数,第3个参数为子图表的位置。以上用3种方法实现了在一张图上绘制多个子图表,3种方法各有所长。subplot()函数和add_subplot()函数比较灵活,定制化效果比较好,可以实现子图表在图中的各种布局(如一张图上可以随意摆放3个或5个图表);而subplots()函数较为不灵活,但它可以用较少的代码实现绘制多个子图表。
十、图表保存
实际工作中,有时需要将绘制的图表保存为图片放置到报告中。Matplotlib的savefig()函数可以实现这一功能,将图表保存为JPEG、TIFF或PNG格式的图片。例如,保存之前绘制的折线图,主要代码如下:
plt.savefig('image.png')
需要注意的一个关键问题:保存代码必须在图表预览前,也就是plt.show()代码前;否则保存后的图片是白色,图表无法保存。