文章目录
Matplotlib介绍
Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型的2D图表和一些基本的3D图表,可根据数据集(DataFrame,Series)自行定义x,y轴,绘制图形(线形图,柱状图,直方图,密度图,散布图等等),能够满足大部分需要。
- Matplotlib最早是为了可视化癫痫病人的脑皮层电图相关的信号而研发,因为在函数的设计上参考了MATLAB,所以叫做Matplotlib。
- 官方文档: https://matplotlib.org/
- Matplotlib中最基础的模块是pyplot。
基本绘图流程
根据Matplotlib图像的4层图像结构,pyplot模块绘制图形基本都遵循一个流程,使用这个流程可以完成大部分图形的绘制。pyplot模块基本绘图流程主要分为3个部分,如下图所示。
1.创建画布与创建子图
第一部分主要是构建出一张空白的画布,如果需要同时展示几个图形,可将画布划分为多个部分。然后使用对象方法来完成其余的工作,示例如下。
pic = plt.figure(figsize=(8,7), dpi = 80) # 创建画布,尺寸为8×7,像素值为80
ax1 = pic.add_subplot(2, 1, 1) # 划分为2×1图形阵,选择第1张图片
2.添加画布内容
第二部分是绘图的主体部分。其中添加标题,坐标轴名称,绘制图形等步骤是并列的,没有先后顺序,可以先绘制图形,也可以先添加各类标签。但是添加图例一定要在绘制图形之后。
3.图形保存与展示
函数名称 | 函数介绍 |
---|---|
plt.savafig | 保存绘制的图片,可以指定图片的分辨率、边缘的颜色等参数。 |
plt.show | 在本机显示图形。 |
设置pyplot的动态rc参数
pyplot使用rc配置文件来自定义图形的各种默认属性,被称为rc配置或rc参数。 由于默认的pyplot字体并不支持中文字符的显示,因此需要通过设置font.sans-serif参数改变绘图时的字体,使得图形可以正常显示中文。同时,由于更改字体后,会导致坐标轴中的负号无法显示,因此需要同时更改axes.unicode_minus参数。
- plt.rcParams[‘font.sans-serif’] = ‘SimHei’ ## 设置中文显示
- plt.rcParams[‘axes.unicode_minus’] = False
- rc参数还可以设置文本、箱线图、坐标轴、刻度、图例、标记、图片、图像保存等属性。
线条常用的rc参数
针对线条常用的rc参数名称、解释与取值如下表所示。
其中lines.linestyle参数4种取值的意义如下表所示。
lines.marker参数的20种取值及其所代表的意义,如下表所示。
管理线条属性的rc参数lines几乎可以控制线条的每一个细节,线条常用的rc参数修改前后对比示例如下代码所示。
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
pic = plt.figure(dpi = 80, figsize = (6, 6))
x = np.linspace(0, 1, 1000)
# 绘制第一张图(从左往右从上到下)
pic.add_subplot(2, 2, 1) # 绘制2×2图形阵中第1张图片
plt.rcParams['lines.linestyle'] = '-.' # 修改线条类型
plt.rcParams['lines.linewidth'] = 1 # 修改线条宽度
plt.plot(x, x ** 2)
plt.title('y = x^2')
# 绘制第二张图
pic.add_subplot(2, 2, 2)
mpl.rc('lines', linestyle = '--', linewidth = 10) # 以matplotlib.rc()函数命令方式修改rc参数
plt.plot(x, x ** 2)
plt.title('y = x^2')
# 绘制第三张图
pic.add_subplot(2, 2, 3)
plt.rcParams['lines.marker'] = None # 修改线条上点的形状
plt.rcParams['lines.linewidth'] = 3
plt.plot(x, x ** 2)
plt.title('y = x^2')
# 绘制第四张图
pic.add_subplot(2, 2, 4)
plt.rcParams['lines.linestyle'] = ':'
plt.rcParams['lines.linewidth'] = 6
plt.plot(x, x ** 2)
plt.title('y = x^2')
plt.savefig('线条rc参数对比.png')#保存图片
plt.show()
运行结果:
坐标轴常用的rc参数
同样,管理坐标轴属性的rc参数axes也能控制坐标轴的任意细节。坐标轴常用的rc参数修改如下所示。
x = np.linspace(0, 10, 1000)
plt.rcParams['axes.edgecolor'] = 'b' # 轴颜色设置为蓝色
plt.rcParams['axes.grid'] = True # 添加网格
plt.rcParams['axes.spines.top'] = False # 去除顶部轴
plt.rcParams['axes.spines.right'] = False # 去除右侧轴
plt.rcParams['axes.xmargin'] = 0.1 # x轴余留为区间长度的0.1倍
plt.plot(x, np.sin(x))
plt.show()
运行结果:
更多的坐标轴常用的rc参数名称、解释、取值如下表所示
分析特征关系常用图形
1.散点图
散点图(Scatter Diagram)又称为散点分布图,是以利用坐标点(散点)的分布形态反映特征间的相关关系的一种图形。实际中一般使用二维散点图,通过散点的疏密程度和变化趋势表示两个特征间关系。散点图有以下3个特点:
· 表现特征之间是否存在数值或者数量的关联趋势,关联趋势是线性的还是非线性的。
· 凸显出离群点(异常点),及对整体的影响。
· 数据量越大,能发挥的作用越好。
pyplot模块中使用scatter函数绘制散点图,其使用语法如下:
scatter函数常用参数及其说明如下表所示。
使用scatter函数绘制2000~2017年各季度的国民生产总值散点图,如下代码所示。
import matplotlib.pyplot as plt
import numpy as np
data = np.load('./数据/国民经济核算季度数据.npz',allow_pickle=True)
name = data['columns'] # 提取columns数组,视为数据的标签
values = data['values'] # 提取values数组,数据的存在位置
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize = (8, 7))
plt.scatter(values[: ,0], values[: , 2], marker = 'o')
plt.xlabel('年份')
plt.ylabel('生产总值(亿元)')
plt.xticks(range(0, 70, 4), values[range(0, 70, 4), 1], rotation = 45)
plt.title('2000~2017年季度生产总值散点图')
plt.savefig('2000~2017年季度生产总值散点图.png')
plt.show()
运行结果:
2.折线图
折线图(Line Chart)是将“散点”按照横坐标顺序用线段依次连接起来的图形。以折线的上升或下降,表示某一特征随另外一特征变化的增减以及总体变化趋势。一般用于展现某一特征随时间的变化趋势。pyplot模块中使用plot函数绘制折线图,其使用语法如下。
- matplotlib.pyplot.plot(*args, **kwargs)
plot函数在官方文档的语法中只要求填入不定长参数,实际可以填入的主要参数,如下表所示。
其中color参数的8种常用颜色的缩写如下表所示。
使用plot函数绘制2000~2017年各产业第一季度季度生产总值折线图,如下代码所示。
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
plt.figure(dpi = 80, figsize = (8, 8))
y1 = values[: : 4, 3]
y2 = values[: : 4, 4]
y3 = values[: : 4, 5]
plt.plot(range(len(y1)), y1, linestyle = '-')
plt.plot(range(len(y2)), y2, linestyle = '--')
plt.plot(range(len(y3)), y3)
plt.xticks(range(len(y3)), values[: : 4, 1], rotation = 45)
plt.title('2000~2017年各产业第一季度折线图')
plt.legend(['第一产业', '第二产业', '第三产业'])
plt.savefig('各产业第一季度折线图.png')
plt.show()
运行结果:
分析特征内部数据状态常用图形
1.直方图
直方图(Histogram)又称频数直方图,由一系列宽度相等、长度不等的长方形来展示特征的频数情况。长方形的宽度表示组距(数据范围的间隔),长度表示在给定间隔内的频数(或频率)与组距的比值,以长方形的面积来表示频数(或频率)。由于分组数据具有连续性,直方图的长方形通常是连续排列的。直方图可以比较直观地展现特征内部数据,便于分析其分布情况。
pyplot中使用hist函数绘制直方图,其基本使用语法如下。
hist函数常用参数及其说明如下表所示。
实例如下
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize = (8, 6), dpi = 100)
mu = 0
sigma = 1
x = np.random.normal(mu, sigma, 10000) # 生成10000个服从标准正态分布数据
plt.hist(x, bins = 20, density = True, rwidth = 0.96) # 绘制直方图
plt.title('标准正态分布数据直方图')
plt.savefig('标准正态分布数据直方图.png')
plt.show()
运行结果:
2.柱状图
- 柱状图(bar chart)是一种以长方形的长度为变量的统计图表。长条图用来比较两个或以上的价值(不同时间或者不同条件),只有一个变量,通常利用于较小的数据集分析。长条图亦可横向排列,或用多维方式表达。
- 柱状图有别于直方图,柱状图无法显示数据在一个区间内的连续变化趋势。柱状图描述的是分类数据,回答的是每一个分类中『有多少?』这个问题。 需要注意的是,当柱状图显示的分类很多时会导致分类名重叠等显示问题。
pyplot中使用bar函数绘制条形图,其基本使用语法如下。
bar函数在官方文档中只要求输入不定长参数,但其主要参数如下表所示。
x = values[-1,3:6]
plt.bar(range(3),x,width = 0.5)
plt.title('2017年第一季度三大产业生产总值')
plt.xlabel('类别')
plt.ylabel('生产总值(亿元)')
plt.xticks(range(3),['第一产业','第二产业','第三产业'])
plt.show()
运行结果:
3.饼图
饼图(Pie Graph)用于表示不同类别的占比情况,通过弧度大小来对比各种类别。饼图通过将一个圆饼按照类别的占比划分成多个区块,整个圆饼代表数据的总量,每个区块(圆弧)表示该分类占总体的比例大小。饼图可以比较清楚地反映出部分与部分、部分与整体之间的比例关系,易于每个类别相对于总数的大小。但因为对于面积大小的不敏感,某些情况下效果不是很好。
pyplot模块中使用pie函数绘制饼图,其使用语法如下。
pie函数常用参数及其说明如下表所示。
x = values[-1,3:6]
plt.title('2017年第一季度三大产业生产总值分布情况')
plt.pie(x,labels=['第一产业','第二产业','第三产业'],autopct='%0.2f%%',explode = [0.1,0,0])
plt.show()
运行结果:
4.箱线图
- 箱线图(Box Plot)又称箱须图,是利用数据中的最小值、上分位数、中位数、下四分位数与最大值这5个统计量来描述连续型特征变量的一种方法。它也可以粗略地看出数据是否具有对称性分布的分散程度等信息,特别可以用于对几个样本的比较。
- 箱线图的上边缘为最大值,下边缘为最小值,但范围不超过盒型各端加1.5倍IQR(四分位距,即上四分位数与下四分位数的极差)的距离。超出上下边缘的值即视为异常值。
pyplot模块中使用boxplot函数绘制箱线图,其基本使用语法如下。
boxplot函数常用参数及其说明如下表所示。
data = np.load('./数据/国民经济核算季度数据.npz',allow_pickle=True)
data.files#含有columns和values两个数组
values = data['values'] # 提取values数组,数据的存在位置
x = values[:,3:6]
plt.title('三大产业分布情况')
plt.xlabel('类别')
plt.ylabel('分布')
plt.boxplot(x,labels=['第一产业','第二产业','第三产业'])
plt.show()
运行结果: