Python中的Matplotlib包

Matplotlib是Python中最常用的绘图模块。主要特点如下:

1、Matplotlib的Pyplot子模块与MATLAB非常相似,可以方便地绘制各种常见统计图形,是用户进行探索式数据分析的重要图形工具。

2、可通过各种函数设置图形中的图标题、线条样式、字符形状、颜色、轴属性以及字体属性等。

下面通过实例代码来进行介绍:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']   # 用来设置字体样式以正常显示中文标签,解决中文显示乱码问题
plt.rcParams['axes.unicode_minus']=False    # 默认是使用Unicode负号,设置正常显示字符,如正常显示负号

data=pd.read_excel('./yuanli/北京市空气质量数据.xlsx')
data=data.replace(0,np.NaN)

# 利用函数plt.figure说明图形的一般特征,如这里宽为15高8。
plt.figure(figsize=(15,8))
# 利用函数plt.plot绘制序列折线图(还可以绘制其他图)。同时,指定折线颜色、线形、线宽等。
plt.plot(data['AQI'],color='black',linestyle='-',linewidth=0.5)

# 利用函数plt.axhline在参数y指定的位置上画一条平行于横坐标的直线,并给定直线图例文字。
# plt.axvline可参数x指定的位置上画一条平行于纵坐标的直线。
plt.axhline(y=data['AQI'].mean(),color='red', linestyle='-',linewidth=0.5,label='AQI总平均值')
data['年']=data['日期'].apply(lambda x:x.year)
# 首先,分组计算各年AQI的平均值;然后,通过for循环绘制多条平行于横坐标的直线,表征各年AQI平均值。
AQI_mean=data['AQI'].groupby(data['年']).mean().values
year=['2014年','2015年','2016年','2017年','2018年','2019年']
col=['red','blue','green','yellow','purple','brown']
for i in range(6):
    plt.axhline(y=AQI_mean[i],color=col[i], linestyle='--',linewidth=0.5,label=year[i])

# 利用title()、xlabel()、ylabel()指定图的标题,横纵坐标的坐标标签。
plt.title('2014年至2019年AQI时间序列折线图')
plt.xlabel('年份')
plt.ylabel('AQI')

# 利用xlim()、ylim()指定横纵坐标的取值范围。
plt.xlim(xmax=len(data), xmin=1)
plt.ylim(ymax=data['AQI'].max(),ymin=1)

# 利用xticks()、yticks()在指定坐标刻度位置上给出刻度标签。
plt.yticks([data['AQI'].mean()],['AQI平均值'])
plt.xticks([1,365,365*2,365*3,365*4,365*5],['2014','2015','2016','2017','2018','2019'])

# 利用legend()在指定位置(这里best表示最优位置)显示图例。
plt.legend(loc='best')

# 利用text()在指定的行列位置上显示指定文字
# 文字的行坐标是data['AQI']取最大值时的索引,纵坐标是最大值-20像素
plt.text(x=list(data['AQI']).index(data['AQI'].max()),y=data['AQI'].max()-20,s='空气质量最差日',color='red')
# 利用show()表示本次绘图结束。
plt.show()

 

# 导入warnings模块,并指定忽略代码运行过程中的警告信息。
import warnings
warnings.filterwarnings(action = 'ignore')

plt.figure(figsize=(10,5))

# subplot(2,2,1)表示将绘图区域分成2行2列4个单元,且下一副图将在第1个单元显示。
plt.subplot(2,2,1)
plt.plot(AQI_mean,color='black',linestyle='-',linewidth=0.5)
plt.title('各年AQI均值折线图')
plt.xticks([0,1,2,3,4,5,6],['2014','2015','2016','2017','2018','2019'])

plt.subplot(2,2,2)
# 利用hist()绘制AQI的直方图,图中包含20个柱形条,即将数据分成20组。
plt.hist(data['AQI'],bins=20)
plt.title('AQI直方图')

plt.subplot(2,2,3)
# 利用scatter()绘制PM2.5和AQI的散点图。并指定点的大小(s),颜色(c)和形状(marker)。
plt.scatter(data['PM2.5'],data['AQI'],s=0.5,c='green',marker='.')
plt.title('PM2.5与AQI散点图')
plt.xlabel('PM2.5')
plt.ylabel('AQI')

plt.subplot(2,2,4)
tmp=pd.value_counts(data['质量等级'],sort=False)  #等同:tmp=data['质量等级'].value_counts()
share=tmp/sum(tmp)
labels=tmp.index
explode = [0, 0.2, 0, 0, 0, 0.2, 0]
# 利用pie()绘制饼图。
# 绘制饼图之前,须事先计算饼图各组成部分的占比、距饼图中心位置的距离(哪些组成部分需要拉出突出显示)
# 考虑标签以及第一个组成部分排放的起始位置等。
plt.pie(share, explode = explode, labels = labels, autopct = '%3.1f%%',startangle = 180, shadow = True)
plt.title('空气质量整体情况的饼图')

 

# 图中四个部分若有重叠的情况,可采用如下方式调整:
# 说明绘图区域的宽和高,并指定将绘图区域分成2行2列4个单元。
# 结果将赋值给fig和axes对象。可通过fig对整个图的特征进行设置,axes对应各个单元格对象。
fig,axes=plt.subplots(nrows=2,ncols=2,figsize=(10,5))
# 通过图形单元索引的方式指定绘图单元。例如:axes[0,0]表示第1行第1列的单元格。
# 单元格对象的图标题、坐标轴标签、坐标刻度等,
# 需采用set_title()、set_xlabel()、set_ylabel()、set_xticks()、set_xticklabels()设置。
axes[0,0].plot(AQI_mean,color='black',linestyle='-',linewidth=0.5)
axes[0,0].set_title('各年AQI均值折线图')
axes[0,0].set_xticks([0,1,2,3,4,5,6])
axes[0,0].set_xticklabels(['2014','2015','2016','2017','2018','2019'])

axes[0,1].hist(data['AQI'],bins=20)
axes[0,1].set_title('AQI直方图')

axes[1,0].scatter(data['PM2.5'],data['AQI'],s=0.5,c='green',marker='.')
axes[1,0].set_title('PM2.5与AQI散点图')
axes[1,0].set_xlabel('PM2.5')
axes[1,0].set_ylabel('AQI')

axes[1,1].pie(share, explode = explode,labels = labels, autopct = '%3.1f%%',startangle = 180, shadow = True)
axes[1,1].set_title('空气质量整体情况的饼图')

# 利用subplots_adjust调整各图形单元行或列之间的距离。
fig.subplots_adjust(hspace=0.5)
fig.subplots_adjust(wspace=0.5)

 def 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)
pie 函数参数详解:
    x     :(每一块)的比例,如果sum(x) > 1会使用sum(x)归一化;
    labels  :(每一块)饼图外侧显示的说明文字;
    explode :(每一块)离开中心距离;
    startangle :起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起;
    shadow  :在饼图下面画一个阴影。默认值:False,即不画阴影;
    labeldistance :label标记的绘制位置,相对于半径的比例,默认值为1.1, 如<1则绘制在饼图内侧;
    autopct :控制饼图内百分比设置,可以使用format字符串或者format function
          '%1.1f'指小数点前后位数(没有用空格补齐);
    pctdistance :类似于labeldistance,指定autopct的位置刻度,默认值为0.6;
    radius  :控制饼图半径,默认值为1;
    counterclock :指定指针方向;布尔值,可选参数,默认为:True,即逆时针。将值改为False即可改为顺时针。
    wedgeprops :字典类型,可选参数,默认值:None。参数字典传递给wedge对象用来画一个饼图。例如:wedgeprops= {'linewidth':3}设置wedge线宽为3。
    textprops :设置标签(labels)和比例文字的格式;字典类型,可选参数,默认值为:None。传递给text对象的字典参数。
    center :浮点类型的列表,可选参数,默认值:(0,0)。图标中心位置。
    frame :布尔类型,可选参数,默认值:False。如果是true,绘制带有表的轴框架。
    rotatelabels :布尔类型,可选参数,默认为:False。如果为True,旋转每个label到指定的角度。

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签

labels = ['娱乐','育儿','饮食','房贷','交通','其它']
sizes = [2,5,12,70,2,9]
explode = (0,0,0,0.1,0,0)
# autopct :控制饼图内百分比设置,可以使用format字符串或者format function;
# '%1.1f':指小数点后保留一位有效数值;
# autopct='%1.2f%%'  保留两位小数点,增加百分号(%);
plt.pie(sizes,explode=explode,labels=labels,autopct='%1.1f%%',shadow=False,startangle=150)
plt.title("饼图示例-8月份家庭支出")
plt.show()

plt.pie(sizes,explode=explode,labels=labels,autopct='%1.1f%%',shadow=False,startangle=150)
plt.title("饼图示例-8月份家庭支出")

plt.axis('equal')   #该行代码使饼图长宽相等,避免绘制出椭圆形

plt.show()

 

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签

labels = 'A','B','C','D'
sizes = [10,10,10,70]
plt.pie(sizes,labels=labels)

plt.title("饼图详解示例")
plt.text(1,-1.2,'By:Biyoulin')
plt.show()

labels = 'A','B','C','Change'
explode = (0,0,0.1,0)  #将第三块分离出来
colors = ['r','g','y','b']  #自定义颜色列表
# labeldistance : label绘制位置,相对于半径的比例, 如<1则绘制在饼图内侧,默认值为1.1;
plt.pie(sizes,explode=explode,labels=labels,colors=colors,
        autopct='%1.2f%%',shadow=True,
        labeldistance=0.8,startangle=30,counterclock=False)
plt.show()

plt.pie(sizes,explode=explode,labels=labels,colors=colors,
        autopct='%1.2f%%',shadow=True,
        labeldistance=0.8,startangle=30,counterclock=False)
# 添加图例
plt.legend(loc="upper right",fontsize=10,bbox_to_anchor=(1.1,1.05),borderaxespad=0.3)
# loc =  'upper right' 位于右上角
# bbox_to_anchor=[0.5, 0.5] # 外边距 上边 右边
# ncol=2 分两列
# borderaxespad = 0.3图例的内边距

# 保存图表,plt.savefig( );
plt.savefig("饼图02.png",dpi=200,bbox_inches='tight') 

plt.show()

 

 

 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值