✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。
🍎个人主页: 小嗷犬的博客
🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。
🥭本文内容:Python 数据可视化:Matplotlib库的使用
1.Matplotlib库简介
Matplotlib
是一个第三方python 2D绘图库,利用它可以画出许多高质量的图像。只需几行代码即可生成直方图,条形图,饼图,散点图等。
Matplotlib
库的名字来源于MATLAB,模仿MATLAB构建,语法也十分相似。
2.Matplotlib库安装
因为Matplotlib
库是第三方库,所以我们要先进行安装。我们可以使用
pip
命令来直接安装:
pip install matplotlib
但这里我推荐直接安装Anaconda
,一个开源的 Python 发行版本,其包含了 Python、NumPy、Matplotlib 等180多个科学包及其依赖项。
官网地址: https://www.anaconda.com/
3.pyplot
pyplot
是Matplotlib
库中最基础的模块,本篇文章主要展示pyplot
的使用。我们平常使用时通常以如下形式导入库:
import matplotlib.pyplot as plt
3.1 基本绘图流程
使用
Matplotlib
库绘图一般遵循以下流程:
- 创建画布(可选)
- 创建子图并选定子图(可选)
- 为图像添加标题、设定图像参数
- 绘制图像
- 添加图例
- 保存图像或显示图像
3.2 常用方法
3.2.1 创建画布
使用
plt.figure()
方法可以创建一块画布,可以通过参数指定它的大小和背景颜色:
plt.figure(figsize=None, facecolor=None)
3.2.2 创建子图并选定子图
使用
plt.subplot()
方法可以在全局绘图区域中创建一个子图,它的语法格式如下:
plt.subplot(nrows, ncols, index, **kwargs)
plt.subplot(pos, **kwargs)
plt.subplot(**kwargs)
plt.subplot(ax)
一共4种创建方式:
- 第一种是用3个参数,分别代表网格的行数
nrows
,列数ncols
,索引号index
。它们都是位置参数。- 第二种是用一个3位数的整数,每一位分别代表网格的行数,列数 ,索引号。
pos
也是是位置参数。- 第三种会用默认值创建一个子图。
- 第四种则以一个
axes
为参数,创建子图。除此之外,我们还可以用
plt.axes(rect,axisbg='w')
方法创建一个坐标系风格的子图:
plt.axes(rect,axisbg='w')
用rect
参数指定位置,用axisbg
参数指定背景颜色。
3.2.3 为图像添加标题、设定图像参数
首先,
Matplotlib
库默认是不支持中文的,使用中文会产生乱码,如果要使用中文可以在导入库后加入下列两行代码来临时修改配置文件:
plt.rcParams["font.sans-serif"]=["SimHei"] # 设置字体为黑体
plt.rcParams["axes.unicode_minus"]=False # 防止负号乱码
我们可以用plt.title()
方法为子图添加标题,也可以使用plt.suptitle()
方法为当前绘图区域添加中心标题。使用
plt.xlabel(s)
和plt.ylabel(s)
方法可以分别设置当前x轴和y轴的标签。使用
plt.grid()
方法可以设置图表中的网格线:
plt.grid(b=None, which='major', axis='both', **kwargs)
参数说明:
b
:可选,默认为 None,可以设置布尔值,true 为显示网格线,false 为不显示,如果设置 **kwargs 参数,则值为 true。which
:可选,可选值有 'major'、'minor' 和 'both',默认为 'major',表示应用更改的网格线。axis
:可选,设置显示哪个方向的网格线,可以是取 'both'(默认),'x' 或 'y',分别表示两个方向,x 轴方向或 y 轴方向。**kwargs
:可选,设置网格样式,可以是 color='r', linestyle='-' 和 linewidth=2,分别表示网格线的颜色,样式和宽度。图像参数还有许多,更多请参见官方手册:https://matplotlib.org/
3.2.4 绘制图像
Matplotlib
库可以绘制许多类型的图,这里以绘制曲线图为例。使用
plt.plot()
方法可以绘制曲线图,语法结构如下:
plt.plot(x, y, format_string, **kwargs)
参数说明:
x
:可选,表示X轴数据,类型为列表或数组。y
:表示Y轴数据,类型为列表或数组。format_string
:可选,由颜色字符、线条字符、标记字符组成。**kwargs
:多组(x,y,format_string),绘制多条曲线。其中常用颜色字符有:
颜色字符 | 颜色 |
---|---|
'b' |
蓝色 |
'g' |
绿色 |
'r' |
红 |
'c' |
青色 |
'm' |
品红 |
'y' |
黄色 |
'k' |
黑 |
'w' |
白色 |
'#008000' |
RGB某颜色 |
'0.8' |
灰度值 |
常用线条字符有:
线条字符 | 线条 |
---|---|
'‐' |
实线 |
'‐‐' |
破折线 |
'‐.' |
点划线 |
':' |
虚线 |
'' ,' ' |
无线条 |
常用标记字符有:
标记字符 | 标记 |
---|---|
"." |
点 |
"," |
像素点 |
"o" |
实心圆 |
"v" |
下三角 |
"^" |
上三角 |
"<" |
左三角 |
">" |
右三角 |
"1" |
下三叉 |
"2" |
上三叉 |
"3" |
左三叉 |
"4" |
右三叉 |
"8" |
八角形 |
"s" |
正方形 |
"p" |
五边形 |
"P" |
加号(加粗) |
"*" |
星号 |
"h" |
竖六边形 |
"H" |
横六边形 |
"+" |
加号 |
"x" |
乘号 x |
"X" |
乘号(加粗) |
"D" |
菱形 |
"d" |
瘦菱形 |
"|" | 竖线 |
"_" |
横线 |
'$...$' |
渲染指定的字符。例如 "$f$" 以字母 f 为标记。 |
除了常用的曲线图外,
Matplotlib
库还可以绘制许多其他种类的图:
函数 | 说明 |
---|---|
plt.plot() | 绘制折线图 |
plt.scatter() | 绘制散点图 |
plt.bar() | 绘制柱状图 |
plt.barh() | 绘制横向柱状图 |
plt.stem() | 绘制火柴图 |
plt.step() | 绘制阶梯图 |
plt.hist() | 绘制直方图 |
plt.boxplot() | 绘制箱线图 |
plt.errorbar() | 绘制误差条图 |
plt.violinplot() | 绘制小提琴图 |
plt.eventplot() | 绘制尖峰栅格图 |
plt.hist2d() | 绘制二维直方图/散点密度图 |
plt.hexbin() | 绘制Hexbin散点图 |
plt.pie() | 绘制扇形图 |
具体用法和参数,请参见官方手册: https://matplotlib.org/
3.2.5 添加图例
我们可以用plt.legend()
方法为子图添加图例,也可以使用plt.figlegend()
方法为全局绘图区域添加图例,传入一个列表参数来给每条线命名。
3.2.6 保存图像或显示图像
使用plt.savefig()
方法可以保存当前图像,参数为文件保存路径及文件名。使用
plt.show()
方法可以显示当前图像。
4.代码实例
用我们所学的方法绘制一张曲线图吧:
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"]=["SimHei"] # 设置字体为黑体
plt.rcParams["axes.unicode_minus"]=False # 防止负号乱码
plt.figure(figsize=(16, 9))
plt.suptitle("图表")
f1 = lambda x:x**0.5
f2 = lambda x:x
f3 = lambda x:x**2
x = list(range(0,6))
y1 = [f1(i) for i in x]
y2 = [f2(i) for i in x]
y3 = [f3(i) for i in x]
plt.subplot(221)
plt.plot(x,y1,'b-v')
plt.title("y=√x")
plt.subplot(222)
plt.plot(x,y2,'g--1')
plt.title("y=x")
plt.subplot(223)
plt.plot(x,y3,'r-.s')
plt.title("y=x^2")
plt.subplot(224)
plt.plot(x,y1,'b-v')
plt.plot(x,y2,'g--1')
plt.plot(x,y3,'r-.s')
plt.title("对比图")
plt.legend(["√x","x","x^2"])
plt.figlegend(["√x","x","x^2"])
plt.show()
效果图: