注:编码中用到的国民生产总值的数据可以在国家数据网站获得。
matplotlib图像可以分为如下四层结构:
1.canvas(画板):位于最底层,导入库时就存在。
2.figure(画布):在画板之上,从这一层开始设置参数。
3.axes(子图):将画布分为不同块,实现分面绘图。
4.图表信息(构图元素):添加或修改axes上的构图信息。
1.基础流程
(1)导入模块
from matplotlib import pyplot as plt
(2)创建画布和子图
pic=plt.figure(figsize=(20,12))#设置画布尺寸
ax1=pic.add_subplot(2,1,1)#将画布划分为2*1的图阵,并选择第一张。
(3)添加画布内容
title | 标题 |
xlabel | x轴名称 |
ylabel | y轴名称 |
xlim | x轴范围 |
ylim | y轴范围 |
xticks | x轴刻度的数目和取值 |
yticks | y轴刻度的数目和取值 |
legend | 图例 |
(4)图形保存和展示
plt.savefig('filepath')#保存
plt.show()#展示
补充:pic.text(x,y,text)函数可以用来在图形的指定位置添加文本标注。
2.绘图风格
pyplot的子模块style里面定义了许多预设风格。可以通过print(plt.style,available)查看所有预设风格名称。
print(plt.style.available)
>
['Solarize_Light2', '_classic_test_patch', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'tableau-colorblind10']
使用plt.style.use函数使用风格:
plt.style.use('bmh')
1.线条常用的rc参数
lines.linewidth | 宽度,取值0-10,默认为1.5 |
lines.linestyle | 样式,可取“-”;“--”;“-.”;“:”四种,默认为“-” |
lines.marker | 线条上点的形状,可取“o","D","h",".","S"等 |
lines.markersize | 点的大小,0-10,默认为1. |
plt.rcParams['lines.linestyle']=':'
plt.rcParams['lines.linewidth']=6
2.坐标轴常用的rc参数
axes.facecolor | 背景颜色,接收颜色简写字符,默认为‘w’ |
axes.edgecolor | 边线颜色,接收颜色简写字符,默认为‘k’ |
axes.linewidth | 轴线宽度,接收0-1的float,默认为0.8. |
axes.grid | 添加网格,bool |
axes.titlesize | 标题大小,"small","medium","large",默认为”large" |
axes.labelsize | 轴标大小,默认为“medium" |
axes.labelcolor | 轴标颜色,默认为”k“ |
axes.spines.{left,right,top,bottom} | 添加坐标轴,bool,默认为True |
axes.{x,y}margin | 轴余留,接收float,默认为0.05. |
plt.rcParams['axes.edgecolor']='b'
plt.rcParams['axes.grid']=True
plt.rcParams['axes.spines.top']=False#去除顶坐标
3.字体常用的rc参数
首先修改参数使其可以正常显示中文字符:
plt.rcParams['font.sans-serif']='SimHei' #设置字体
plt.rcParams['axes.unicode_minus']=False #解决负号显示异常问题
font.family | 字体族,每一个族对应多种字体 |
font.style | 字体风格,normal(正常),italic(罗马体),oblique(斜体) |
font.size | 字体大小,float,默认为10. |
font.weight | 字体重量 |
font.stretch | 字体延伸 |
font.variant | 字体变化 |
散点图有以下特点:
1.表现特征之间是否存在数值或者数量的关联趋势,关联趋势是线性还是非线性的。
2.凸显离群点及其对总体的影响。
3.数据量越大发挥的作用越好。
函数:plt.scatter
常用参数:
x,y | 接收array,x轴与y轴对应的数据。 |
s | 接收数值或者一维array,表示点的大小。 |
c | 接收颜色或者一维array,点的颜色,array表示每个点的颜色。 |
marker | str,点的形状。 |
alpha | 0-1,透明度。 |
x=np.arange(16)
y=x**2
plt.figure(figsize=(10,8))
plt.rcParams['font.sans-serif']='SimHei' #设置字体
plt.rcParams['axes.unicode_minus']=False #解决负号显示异常问题
plt.scatter(x,y,marker='D')
plt.xlabel('数值')
plt.ylabel('平方')
plt.title('y=x^2的图像')
import pandas as pd
data=pd.read_excel('季度数据.xls')
y1=data['国内生产总值当季值(亿元)']
y2=data['第一产业增加值当季值(亿元)']
y3=data['第二产业增加值当季值(亿元)']
y4=data['第三产业增加值当季值(亿元)']
x=data['指标'][::-1]
plt.figure(figsize=(10,8))
#解决中文无法显示
plt.rcParams['font.sans-serif']='SimHei' #设置字体
plt.rcParams['axes.unicode_minus']=False #解决负号显示异常问题
plt.title('近18个季度各产业生产总值')
plt.scatter(x,y1)
plt.scatter(x,y2)
plt.scatter(x,y3)
plt.scatter(x,y4)
plt.xticks(rotation=45)
plt.legend(['国内生产总值','第一产业增加值','第二产业增加值','第三产业增加值'])
plt.show()
一般用于展示某一特征随时间变化趋势。
函数:plt.plot()
常用参数:
x,y | |
color | 线条颜色 |
linestyle | 线条类型 |
marker | 点的形状 |
alpha | 透明度 |
常用颜色:
b | 蓝色 |
g | 绿色 |
r | 红色 |
c | 青色 |
m | 品红 |
y | 黄色 |
k | 黑色 |
w | 白色 |
plt.rcParams['font.sans-serif']='SimHei' #设置字体
plt.rcParams['axes.unicode_minus']=False #解决负号显示异常问题
plt.figure(figsize=(10,8))
y1=data['第一产业增加值累计值(亿元)'][::-1][::4]#先把数据逆序排列,再每间隔四个取一次值以只绘制第一季度数据
y2=data['第二产业增加值累计值(亿元)'][::-1][::4]
y3=data['第三产业增加值累计值(亿元)'][::-1][::4]
plt.plot(range(len(y1)),y1,linestyle='-.')
plt.plot(range(len(y2)),y2,linestyle='--')
plt.plot(range(len(y3)),y3)
plt.xlabel('年份')
plt.ylabel('生产总值(亿元)')
plt.xticks(range(len(y3)),data['指标'][::-1][::4],rotation=45)
plt.title('各产业近十年第一季度生产总值折线图')
plt.legend(['第一产业','第二产业','第三产业'])
plt.show()
用于表现不同类别的占比情况。
函数:plt.pie()
常用参数:
x | array |
label | array,每一项的名称。 |
color | 颜色 |
autopct | 指定数值的显示方式。 |
pctdistance | float,指定每一项的比例和距离饼图圆心的距离。 |
labeldistance | float,指定每一项的名称和距离圆心的距离。 |
radius | float,饼图的圆心。 |
explode | array,指定项距离圆心的距离。 |
import numpy as np
labs=['第一产业','第二产业','第三产业']#定义饼图标签
explode=[0.01,0.01,0.01]#设置各项离心0.01个半径
plt.figure(figsize=(8,4))
plt.pie(np.sum(data.iloc[0:4,[4,6,8]],axis=0),autopct='%1.1f%%',labels=labs,explode=explode)
plt.title('2011年产业结构')
#前四行为2011年四个季度的数据,第5,7,9列分别为三个产业的生产总值数据,将其取出后纵向做和就得到了2011年各产业的生产总值。
#autopct设置显示百分数在图上
1.直方图
用来展示特征的频数分布情况,便于分析数据分布情况。
函数:plt.hist()
常用参数:
x | 接收array,表示x轴数据。 |
bins | 接收int或sequence,表示长方形条数。 |
range | 接收tuple,筛选数据范围。 |
density | bool,表示选择频率图还是频数图。默认为True,频率图。 |
rwidth | 0-1,表示长方形的宽度。 |
plt.rcParams['font.sans-serif']='SimHei'
plt.rcParams['axes.unicode_minus']=False
mu=0
sigma=1
x=np.random.normal(mu,sigma,10000)
plt.hist(x,bins=20,density=True,rwidth=1)
plt.title('标准正态分布的频率直方图')
plt.show()
2.条形图
条形图主要用于展示分类数据,一个长方形代表一个分类类别,宽度没有数学意义。
函数:plt.bar()
常用参数:
x | array,x轴位置序列 |
height | array,x轴代表数据的数量(长方形的长度) |
width | 0-1,float,长方形的宽,默认为0.8 |
color | 指定str或array,颜色。 |
data2020=np.sum(data.iloc[3:7,[4,6,8]])#取出2020年各产业四个季度的数据并做和得到一整年的数据。
data2020
>
第一产业增加值累计值(亿元) 162115.0
第二产业增加值累计值(亿元) 897336.9
第三产业增加值累计值(亿元) 1336661.8
dtype: float64
plt.bar(range(3),data2020.values)
#在条形图上添加数据信息
for i in range(len(data2020.values)):
plt.text(i,data2020.values[i],'{}亿元'.format(data2020.values[i]),va='bottom',ha='center')
plt.xticks(range(3),['第一产业','第二产业','第三产业'])
plt.title('2020年各产业国民生产总值条形图')
plt.show()
可以看出数据是否具有对称性以及分布的离散程度等信息。
函数:plt.boxplot()
常用参数:
x | array,用于绘制箱线图的数据。 |
notch | bool,中间箱体是否有缺口。 |
sym | 特定的str,指定异常点的形状。 |
vert | bool,图形是纵向还是横向。 |
positions | array,图形位置。 |
widths | 每个箱体的宽度。 |
labels | 指定每一个箱线图的标签。 |
meanline | bool,是否显示均值线,默认为False。 |
plt.figure(figsize=(12,8))
plt.boxplot([data.iloc[:,4],data.iloc[:,6],data.iloc[:,8]],notch=True,meanline=True)
plt.xticks(range(1,4),['第一产业','第二产业','第三产业'])
plt.title('2011年以来各产业国民生产总值箱线图')
plt.show()