文章目录
1. Matplotlib 介绍
Matplotlib 是最流行的用于绘制图表的 Python 库,是 Python 的 2D 绘图库。Matplotlib 的操作简单,只需几行代码就可以生成直方图、条形图、折线图、散点图等图形。Matplotlib 中应用最广泛的是 matplotlib.pyplot 模块。matplotlib.pyplot 是一个命令风格函数的集合,使得 Matplotlib 的机制更像 MATLAB。
2. 绘图基本语法与常用参数
2.1 pyplot 基础语法
2.1.1 创建画布与创建子图
第一部分的主要作用是构建一个空白画布,并可以选择是否将整个画布划分为多个部分以便在同一幅图上绘制多个图形的情况。当只需绘制一幅图时,这部分内容可以省略。
函数名称 | 函数作用 |
---|---|
plt.figure | 创建一个空白画布,可以指定画布大小、像素 |
figure.add_subplot | 创建并选中子图,可以指定子图行数、列数和选中图片的编号 |
2.1.2 添加画布内容
第二部分是绘图的主体部分。其中添加标题、添加坐标轴名称、绘制图形等步骤是并列的,没有先后顺序。但是添加图例一定要在绘制图形之后。
函数名称 | 函数作用 |
---|---|
plt.title | 在当前图形中添加标题,可以指定标题的名称、位置、颜色、字体大小等参数 |
plt.xlabel | 在当前图形中添加 x 轴名称,可以指定位置、颜色、字体大小等参数 |
plt.ylabel | 在当前图形中添加 y 轴名称,可以指定位置、颜色、字体大小等参数 |
plt.xlim | 指定当前图形 x 轴范围,只能确定一个数值区间,而无法使用字符串标识 |
plt.ylim | 指定当前图形 y 轴范围,只能确定一个数值区间,而无法使用字符串标识 |
plt.xticks | 指定 x 轴刻度的数目与取值 |
plt.yticks | 指定 y 轴刻度的数目与取值 |
plt.legend | 指定当前图形的图例,可以指定图例的大小、位置、标签 |
2.1.3 保存与显示图形
函数名称 | 函数作用 |
---|---|
plt.savefig | 保存绘制的图形,可以指定图形的分辨率、边缘的颜色等参数 |
plt.show | 在本机中显示图形 |
# pyplot中的基础绘图语法
import numpy as np
import matplotlib.pyplot as plt
# %matplotlib inline # 表示在行中显示图片,在命令行运行报错
data = np.arange(0,1,0.01)
plt.title('lines') # 标题
plt.xlabel('x') # x轴名称
plt.ylabel('y') # y轴名称
plt.xlim((0,1)) # x轴范围
plt.ylim((0,1)) # y轴范围
plt.xticks([0,0.2,0.4,0.6,0.8,1]) # x轴刻度
plt.xticks([0,0.2,0.4,0.6,0.8,1]) # y轴刻度
plt.plot(data,data**2) # y=x^2 曲线
plt.plot(data,data**4) # y=x^4 曲线
plt.legend(['y=x^2','y=x^4']) # 图例
plt.savefig('y=x^2.png') # 保存图片
plt.show() # 显示图片
# 包含子图绘制的基础语法
rad = np.arange(0,np.pi*2,0.01)
# 第一幅图
p1 = plt.figure(figsize=(8,6),dpi=80) # 确定画布大小(默认(6.4,4.8))及像素(默认100)
ax1 = p1.add_subplot(2,1,1) # 创建一个2行1列的子图
plt.title('lines')
plt.xlabel('x')
plt.ylabel('y')
plt.xlim((0,1))
plt.ylim((0,1))
plt.xticks([0,0.2,0.4,0.6,0.8,1])
plt.xticks([0,0.2,0.4,0.6,0.8,1])
plt.plot(rad,rad**2)
plt.plot(rad,rad**4)
plt.legend(['y=x^2','y=x^4'])
# 第二幅子图
ax2 = p1.add_subplot(2,1,2)
plt.title('sin/cos')
plt.xlabel('rad')
plt.ylabel('value')
plt.xlim((0,np.pi*2))
plt.ylim((-1,1))
plt.xticks([0,np.pi/2,np.pi,np.pi*1.5,np.pi*2])
plt.yticks([-1,-0.5,0,0.5,1])
plt.plot(rad,np.sin(rad))
plt.plot(rad,np.cos(rad))
plt.legend(['sin','cos'])
plt.savefig('sincos.png')
plt.show()
2.2 设置 pyplot 动态的 rc 参数
pyplot 使用 rc 配置文件来自定义图形的各种默认属性,被称为 rc 配置或 rc 参数。默认 rc 参数可以在 Python 交互式环境中动态更改。所有存储在字典变量中的 rc 参数,都被称为 rcParams。rc 参数在修改后,绘图时使用默认的参数就会发生改变。
# 调节线条的 rc 参数
# 原图
x = np.linspace(0,4*np.pi) # 生成x轴数据均匀50个
y = np.sin(x)
plt.plot(x,y)
plt.title('sin')
plt.show()
# 修改rc参数后的图
plt.rcParams['lines.linestyle'] = '-.'
plt.rcParams['lines.linewidth'] = 3
plt.plot(x,y)
plt.title('sin')
plt.show()
# 设置rc参数显示中文标题(默认pyplot不显示中文)
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False # 设置正常显示符号
plt.plot(x,y)
plt.title('sin 曲线')
plt.show()
rc 参数名称 | 解释 | 取值 |
---|---|---|
lines.linewidth | 线条宽度 | 取 0~10 之间的数值,默认为 1.5 |
lines.linestyle | 线条样式 | 可取 “-”、“- -”、“-.”、“:” 四种,对应为 “实线”、“长虚线”、“点线”、“短虚线”,默认为 “-” |
lines.marker | 线条上点的形状 | 可取 “o”,“D”,“h”,“,”,“.”,“S” 等 20 种,默认为 None |
lines.markersize | 点的大小 | 取 0~10 之间的数值,默认为 1 |
lines.marker 取值 | 意义 | lines.marker 取值 | 意义 | lines.marker 取值 | 意义 |
---|---|---|---|---|---|
‘o’ | 圆圈 | ‘.’ | 点 | ‘D’ | 菱形 |
‘d’ | 小菱形 | ‘h’ | 六边形1 | ‘H’ | 六边形2 |
‘s’ | 正方形 | ‘8’ | 八边形 | ‘’p | 五边形 |
‘*’ | 星号 | ‘-’ | 水平线 | ‘x’ | X |
‘v’ | 一角朝下的三角形 | ‘<’ | 一角朝左的三角形 | ‘>’ | 一角朝右的三角形 |
‘^’ | 一角朝上的三角形 | ‘+’ | 加号 | ‘\’ | 竖线 |
‘None’ | 无 | ‘,’ | 像素 |
3. 散点图和折线图
散点图 和 折线图 是数据分析中最常用的两种图形。这两种图形都能够分析不同数值型特征间的关系。其中,散点图用于分析特征间的相关关系,折线图用于分析自变量特征和因变量特征之间的趋势关系。
3.1 绘制散点图
散点图(Scatter Diagram)又称为散点分布图,是以一个特征为横坐标,以另一个特征为纵坐标,利用坐标点(散点)的分布反映特征间的统计关系的一种图形。值由点在图表中的位置表示,类别由图表中的不同标记表示,通常用于比较跨类别的数据。
散点图可以显示两种关键信息:
- 特征之间是否存在数值或者数量的关联趋势,关联趋势是线性还是非线性的。
- 判断是否有离群点。如果某一个点或者某几个点偏离大多数点,则这些点就是离群点。
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, *, plotnonfinite=False,
data=None, **kwargs)
# 绘制2000-2017年各季度国民生产总值散点图
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
data = np.load('国民经济核算季度数据.npz',allow_pickle=True)
name = data['columns'] # 数据的标签数组(数据的每列名字)
values = data['values'] # 数据数组
print(name)
print(values)
plt.figure(figsize=(8,7))
plt.scatter(values[:,0],values[:,2])
plt.xlabel('年份')
plt.ylabel('生产总值(亿元)')
plt.xticks(range(0,70,4),values[range(0,70,4),1],rotation=45)
plt.title('2000--2017年各季度国民生产总值散点图')
plt.show()
# 绘制2000-2017年间各产业各季度国民生产总值散点图
plt.figure(figsize=(8,7))
# 散点图1
plt.scatter(values[:,0],values[:,3],marker="o",c="red")
# 散点图2
plt.scatter(values[:,0],values[:,4],marker="D",c="blue")
# 散点图3
plt.scatter(values[:,0],values[:,5],marker="v",c="yellow")
plt.xlabel('年份')
plt.ylabel('生产总值(亿元)')
plt.xticks(range(0,70,4),values[range(0,70,4),1],rotation=45)
plt.title('2000-2017年间各产业各季度国民生产总值散点图')
plt.legend(['第一产业','第二产业','第三产业'])
plt.show()
3.2 绘制折线图
折线图(Line Chart)是一种将数据按照顺序连接起来的图形。可以看作是将散点图按照 x 轴坐标顺序连接起来的图形。折线图的主要功能是查看因变量 y 随着自变量 x 改变的趋势。
matplotlib.pyplot.plot(*args, scalex=True, scaley=True, data=None, **kwargs)
文档中的语法只要求输入不定长参数,实际可以输入的参数主要有:
参数名称 | 说明 |
---|---|
x,y | 接收 array。表示 x 轴和 y 轴对应的数据。无默认。 |
color | 接收待定 string。指定线条颜色。默认为 None。 |
linestyle | 接收待定 string。指定线条类型。默认为 “-”。 |
marker | 接收待定 string。表示绘制点的类型。默认为 None。 |
alpha | 接收 0~1 的小数。表示点的透明度。默认为 None。 |
颜色缩写 | 代表的颜色 | 颜色缩写 | 代表的颜色 | 颜色缩写 | 代表的颜色 | 颜色缩写 | 代表的颜色 |
---|---|---|---|---|---|---|---|
b | 蓝色 | y | 黄色 | g | 绿色 | r | 红色 |
w | 白色 | k | 黑色 | c | 青色 | m | 品红 |
# 绘制2000-2017年各季度国民生产总值折线图
plt.figure(figsize=(8,7))
plt.plot(values[:,0],values[:,2],color = 'r',linestyle = '--')
plt.xlabel('年份')
plt.ylabel('生产总值(亿元)')
plt.xticks(range(0,70,4),values[range(0,70,4),1],rotation=45)
plt.title('2000-2017年各季度国民生产总值折线图')
plt.show()
# 绘制2000-2017年各产业生产总值折线散点图
plt.figure(figsize=(8,7))
plt.plot(values[:,0],values[:,3],'bs-', # 将线的颜色、形状和类型三个参数连在一起
values[:,0],values[:,4],'ro-.',
values[:,0],values[:,5],'gH--',)
plt.xlabel('年份')
plt.ylabel('生产总值(亿元)')
plt.xticks(range(0,70,4),values[range(0,70,4),1],rotation=45)
plt.title('2000-2017年各产业生产总值折线散点图')
plt.legend(['第一产业','第二产业','第三产业'])
plt.show()
4.直方图、饼图和箱线图
直方图、饼图和箱线图是另外三种数据分析的常用图形,主要用于分析数据内部的分布状态和分散状态。直方图主要用于查看分组数据的数量分布,以及各个分组数据之间的数量比较。饼图倾向于查看各分组数据在总数据中的占比。箱线图的主要作用是发信整体数据的分布分散情况。
4.1 绘制直方图
直方图(Histogram)又称质量分布图,是统计报告图的一种,由一系列高度不等的纵向条纹或线段表示数据分布的情况,一般用横轴表示数据所属类别,用纵轴表示数量或者占比。用直方图可以比较直观地看出产品特性的分布状态,便于判断其总体质量分布情况。在直方图中可以发现分布表无法发现的数据模式、样本的频率分布和总体的分布。
matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)
# 绘制2017年第一季度各产业国民生产总值直方图
plt.figure(figsize=(6,5))
plt.bar(range(3),values[-1,3:6],width = 0.5)
plt.xlabel('产业')
plt.ylabel('生产总值(亿元)')
label = ['第一产业','第二产业','第三产业']
plt.xticks(range(3),label)
plt.title('2017年第一季度各产业国民生产总值直方图')
plt.show()
4.2 绘制饼图
饼图(Pie Graph)是将各项大小与各项总和的比例显示在一张 ”饼“ 中,以 ”饼“ 的大小确定每一项的占比。饼图可以比较清楚地反映出部分与部分、部分与整体之间的比例关系,易于显示每组数据相对于总数的大小,而且显示方式直观。
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, *,
data=None)
# 绘制2017年第一季度各产业国民生产总值饼图
plt.figure(figsize=(6,6))
label = ['第一产业','第二产业','第三产业']
explode = [0.01,0.01,0.01] # 设置各项距离圆心n个半径(每个扇形间的空隙大小)
plt.pie(values[-1,3:6],explode=explode,labels=label,autopct='%1.1f%%')
plt.title('2017年第一季度各产业国民生产总值饼图')
plt.show()
4.3 绘制箱线图
箱线图(Boxplot)也称箱须图,其绘制需使用常用的统计量,能够提供有关数据位置和分散情况的关键信息,尤其在比较不同特征时,更可表现其分散程度差异。
箱线图利用数据中的 5 个统计量(最小值、下四分位数、中位数、上四分位数和最大值)来描述数据。它可以粗略看出数据是否具有对称性、分布的分散程度等信息,特别是可以用于几个样本的比较。
matplotlib.pyplot.boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None,
patch_artist=None, bootstrap=None, usermedians=None, conf_intervals=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, manage_ticks=True, autorange=False, zorder=None,
*, data=None)
# 绘制2000-2017年各产业国民生产总值箱线图
label = ['第一产业','第二产业','第三产业']
plt.figure(figsize=(7,5))
plt.boxplot((values[:,3],values[:,4],values[:,5]),labels=label,notch=True,meanline=True)
plt.title('2000-2017年各产业国民生产总值箱线图')
plt.show()