Python 数据分析与展示笔记3 -- Matplotlib 库基础
Python 数据分析与展示笔记3 – Matplotlib 库基础
Python 数据分析与展示系列笔记是笔者学习、实践Python 数据分析与展示的相关笔记
课程链接: Python 数据分析与展示
参考文档:
Numpy 官方文档(英文)
Numpy 官方文档(中文)
PIL 官方文档
Matplotlib 官方文档
一、Matplotlib 库
Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。
1、安装与导入
# 安装
pip install matplotlib
# 导入,常用的是他的绘图子模块 pyplot
import matplotlib.pyplot as plt
2、测试
import matplotlib.pyplot as plt
plt.plot([2, 1, 4, 5, 3])
plt.show()
二、库基本绘图
Matplotlib 绘图默认有一个画布,所有的绘图设置及操作是对同一个画布进行的,多次plot()会产生覆盖
1、绘图函数:plot()
函数原型:
plt.plot(x, y, format_string, **kwargs)
参数:
- x:X轴数据,列表或数组,可选
- y:Y轴数据,列表或数组,如果没有给定x,则默认 x 轴的值为对应的 y 的下标
- format_string:控制曲线的格式字符串,可选
- **kwargs:多组的(x, y, format_string),绘制多条曲线,各条曲线的x不能省略
format_string: 由颜色字符、风格字符和标记字符组成,可自由组合
颜色字符 | 说明 |
---|---|
‘b’ | 蓝色 |
‘g’ | 绿色 |
‘r’ | 红色 |
‘c’ | 青绿色 |
‘#008000’ | RGB某颜色 |
‘m’ | 洋红色magenta |
‘y’ | 黄色 |
‘k’ | 黑色 |
‘w’ | 白色 |
‘0.8’ | 灰度值字符串 |
风格字符 | 说明 |
---|---|
‘‐’ | 实线 |
‘‐‐’ | 破折线 |
‘‐.’ | 点划线 |
‘:’ | 虚线 |
’ ’ | 无线条 |
标记字符 | 说明 |
---|---|
‘.’ | 点标记 |
‘,’ | 像素标记(极小点) |
‘o’ | 实心圈标记 |
‘v’ | 倒三角标记 |
‘^’ | 上三角标记 |
‘>’ | 右三角标记 |
‘<’ | 左三角标记 |
‘1’ | 下花三角标记 |
‘2’ | 上花三角标记 |
‘3’ | 左花三角标记 |
‘4’ | 右花三角标记 |
‘s’ | 实心方形标记 |
‘p’ | 实心五角标记 |
‘*’ | 星形标记 |
‘h’ | 竖六边形标记 |
‘H’ | 横六边形标记 |
‘+’ | 十字标记 |
‘x’ | x标记 |
‘D’ | 菱形标记 |
‘d’ | 瘦菱形标记 |
‘|’ | 垂直线标记 |
示例:
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(10)
plt.plot(a, a*1.5, 'go-', a, a*2.5, 'rx:', a, a*3.5, '*', a, a*4.5, 'b-.')
plt.show()
2、坐标图格式控制
# 设置 x,y 轴范围
plt.axis([x轴左点,x轴右点,y轴下点,y轴上点])
# 网格设置,True为显示网格,默认不显示
plt.grid(True)
# 显示
plt.show()
# 保存,PNG格式
plt.savefig('图片路径',dpi = 每英寸点数)
3、显示中文
全局设置: 修改 rcParams 字典
import matplotlib
matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['font.size'] = 20
- rcParams 属性
属性 | 说明 |
---|---|
‘font.family’ | 用于显示字体的名字 |
‘font.style’ | 字体风格,正常’normal’或斜体’italic’ |
‘font.size’ | 字体大小,整数字号或者’large’、‘x‐small’ |
- 中文字体
中文字体 | 说明 |
---|---|
‘SimHei’ | 中文黑体 |
‘Kaiti’ | 中文楷体 |
‘LiSu’ | 中文隶书 |
‘FangSong’ | 中文仿宋 |
‘YouYuan’ | 中文幼圆 |
‘STSong’ | 华文宋体 |
局部设置: 每个需要绘制文字的函数中单独设置文字的相关属性
属性 | 说明 |
---|---|
fontproperties | 字体类型 |
fontsize | 字体大小 |
4、文本显示
函数 | 说明 |
---|---|
plt.xlabel(‘x轴标签’) | 对X轴增加文本标签 |
plt.ylabel(‘y轴标签’) | 对Y轴增加文本标签 |
plt.title(‘图名’) | 对图形整体增加文本标签 |
plt.text(x坐标,y坐标,‘文字’) | 在任意位置增加文本 |
plt.annotate() | 在图形中增加带箭头的注解 |
plt.annotate(s, xy=arrow_crd, xytext=text_crd, arrowprops=dict)
- s:注解的字符串
- xy:箭头坐标(x, y)
- xytext:文字坐标(x, y)
- arrowprops:箭头格式,字典
示例:
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(0.0, 5.0, 0.02)
plt.plot(a, np.cos(2*np.pi*a))
plt.xlabel('横轴:时间', fontproperties='SimHei', fontsize=20, color='red')
plt.ylabel('纵轴:振幅', fontproperties='SimHei', fontsize=20)
plt.title(r'正弦波$y=cos(2\pi x)$', fontproperties='SimHei', fontsize=20)
plt.annotate(r'$\mu=100$', xy=(2, 1), xytext=(3, 1.5), fontsize=15,
arrowprops=dict(facecolor='black', shrink=0.1, width=2))
plt.axis([-1, 6, -2, 2])
plt.grid(True)
plt.show()
5、绘图区域:划分子图
简单的绘图区域划分:
- 一次只能选择一个子图,子图的编号从1开始
- 可以重新划分区域,但是选择的子图不能与之前的有交集,否则会覆盖之前的
- plt.subplot(nrows, ncols, plot_number)
- nrows:分为几行
- ncols:分为几列
- plot_number:当前要绘制的子图号,从左到右从上到下编号
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(0.0, 5.0, 0.02)
# 第一个子图
plt.subplot(211)
plt.plot(a, np.cos(a))
# 第二个子图
plt.subplot(223)
plt.plot(a, np.sin(a))
# 第三个子图
plt.subplot(224)
plt.plot(a, a/5)
plt.show()
复杂的绘图区域划分:
- 划分绘图区域网格时,行列的编号都从0开始
- 选择子图时,可以按多行多列区域选中
- plt.subplot2grid(GridSpec, CurSpec, colspan=1, rowspan=1)
- GridSpec:网格的行列数,元组形式,(rows,cols)
- CurSpec:选中子图的起始网格坐标,元组形式,(row, col)
- colspan:子图的长,即列数
- rowspan:子图的高,即行数
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(0.0, 5.0, 0.02)
# 第一个子图
plt.subplot2grid((2, 3), (0, 0), colspan=3)
plt.plot(a, np.cos(a))
plt.title('a')
# 第二个子图
plt.subplot2grid((2, 3), (1, 0), colspan=2)
plt.plot(a, np.sin(a))
plt.title('b')
# 第三个子图
plt.subplot2grid((2, 3), (1, 2))
plt.plot(a, a/5)
plt.title('c')
plt.show()
GridSpec 类:
- 用于复杂的绘图区域划分,子图选择更方便
- 采用切片的方法选择子图
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.gridspec as gs
g = gs.GridSpec(2, 3)
a = np.arange(0.0, 5.0, 0.02)
# 第一个子图
ax1 = plt.subplot(g[0, :-1])
ax1.plot(a, np.cos(a))
# 第二个子图
ax2 = plt.subplot(g[0:2, 2])
ax2.plot(a, np.sin(a))
# 第三个子图
ax3 = plt.subplot(g[1, 0])
ax3.plot(a, a/5)
plt.show()
三、面向对象绘图
Matplotlib绘图可以采用面向对象的方式,即可以创建(实例化)多个画布,分别对不同的画布进行操作,多一个画布可以多次 plot() 不会覆盖
1、创建新画布:plt.figure()
函数原型:
plt.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True, FigureClass=<class 'matplotlib.figure.Figure'>, clear=False, **kwargs)[source]
参数:
- num:整数或字符串,可选,默认值:无。画布的编号,如果未提供,将创建新图形,并且图形编号将自动递增。画布对象将此数字保存在 number 属性中。如果提供了num且存在该num的画布,返回对它的引用。如果此画布不存在,则创建并返回画布对象。如果num是一个字符串,则显示画布的窗口标题为 num。
- figsize:整数元组,可选,默认值:无。单位为英寸。如果未提供,则默认为 rcParams[“figure.figsize”]= [6.4, 4.8]
- dpi:整数,可选,默认值:无。画布的每英寸点数。如果未提供,则默认为 rcParams[“figure.dpi”]= 100
- facecolor:背景颜色。如果未提供,则默认为白色 rcParams[“figure.facecolor”]= ‘w’
- edgecolor:边框颜色。如果未提供,则默认为白色 rcParams[“figure.edgecolor”]= ‘w’。
- frameon:bool,optional,默认值:True,如果为False,则禁止绘制图框
- FigureClass:Figure的 子类,(可选)使用自定义Figure实例
- clear:bool,可选,默认值:False,如果为True并且该图已经存在,那么它将被清除
返回:
- 返回画布对象
- 如果要创建许多画布,确保明确调用 plt.close() 释放未使用的画布,使pyplot可以正确清理内存
- rcParams定义的默认值,可以在 matplotlibrc 文件中修改
示例:
import numpy as np
import matplotlib.pyplot as plt
a = np.arange(0, 5.0, 0.02)
# 创建画布
fig1 = plt.figure(num='fig', figsize=(6, 4))
plt.plot(a, np.cos(a), c="red", label="cos")
plt.plot(a, np.sin(a), c="blue", label="sin")
# 设置图例的位置
plt.legend(loc="best")
# 嵌入小图,位置为画布的比例
left, bottom, width, height = 0.2, 0.2, 0.2, 0.1
ax1 = fig1.add_axes([left, bottom, width, height])
ax1.plot(a, a)
plt.show()
GOOD LUCK!