1、概念
Matplotlib 库:是一款用于数据可视化的 Python 软件包,支持跨平台运行,它能够根据 NumPy ndarray 数组来绘制 2D 图像,它使用简单、代码清晰易懂
2、常用API
2.1 绘图类型
函数名称 | 描述 |
---|---|
bar | 绘制条形图 |
barh | 绘制水平条形图 |
boxplot | 绘制箱型图 |
hist | 绘制直方图 |
his2d | 绘制2D直方图 |
pie | 绘制饼状图 |
plot | 在坐标轴上画线或者标记 |
polar | 绘制极坐标图 |
scatter | 绘制x与y的散点图 |
stackplot | 绘制堆叠图 |
stem | 用来绘制二维离散数据绘制(又称为火柴图) |
step | 绘制阶梯图 |
quiver | 绘制一个二维按箭头 |
2.2 Image 函数
函数名称 | 描述 |
---|---|
imread | 从文件中读取图像的数据并形成数组 |
imsave | 将数组另存为图像文件 |
imshow | 在数轴区域内显示图像 |
2.3 Axis 函数
函数名称 | 描述 |
---|---|
axes | 在画布(Figure)中添加轴 |
text | 向轴添加文本 |
title | 设置当前轴的标题 |
xlabel | 设置x轴标签 |
xlim | 获取或者设置x轴区间大小 |
xscale | 设置x轴缩放比例 |
xticks | 获取或设置x轴刻标和相应标签 |
ylabel | 设置y轴的标签 |
ylim | 获取或设置y轴的区间大小 |
yscale | 设置y轴的缩放比例 |
yticks | 获取或设置y轴的刻标和相应标签 |
2.4 Figure 函数
函数名称 | 描述 |
---|---|
figtext | 在画布上添加文本 |
figure | 创建一个新画布 |
show | 显示数字 |
savefig | 保存当前画布 |
close | 关闭画布窗口 |
5.pylab 模块
pyLab 是一个面向 Matplotlib 的绘图库接口,其语法和 MATLAB 十分相近。
pylab 是 matplotlib 中的一个模块,它将 matplotlib.pyplot 和 numpy 的功能组合在一起,使得你可以直接使用 numpy 的函数和 matplotlib.pyplot 的绘图功能,而不需要显式地导入 numpy 和 matplotlib.pyplot。
但是不常用pylab模块,容易命名空间污染,且pylab不够灵活,不适合大型项目。
6.常用函数
6.1 plot 函数
pylab.plot 是一个用于绘制二维图形的函数。它可以根据提供的 x 和 y 数据点绘制线条和/或标记。
pylab.plot(x, y, format_string=None, **kwargs)
参数:
-
x: x 轴数据,可以是一个数组或列表。
-
y: y 轴数据,可以是一个数组或列表。
-
format_string: 格式字符串,用于指定线条样式、颜色等。
-
**kwargs: 其他关键字参数,用于指定线条的属性。
plot 函数可以接受一个或两个数组作为参数,分别代表 x 和 y 坐标。如果你只提供一个数组,它将默认用作 y 坐标,而 x 坐标将默认为数组的索引。
格式字符串:
格式字符串由颜色、标记和线条样式组成。例如:
颜色:
'b':蓝色 'g':绿色 'r':红色 'c':青色 'm':洋红色 'y':黄色 'k':黑色 'w':白色
标记:
'.':点标记
',':像素标记
'o':圆圈标记
'v':向下三角标记
'^':向上三角标记
'<':向左三角标记
'>':向右三角标记
's':方形标记
'p':五边形标记
'*':星形标记
'h':六边形标记1
'H':六边形标记2
'+':加号标记
'x':叉号标记
'D':菱形标记
'd':细菱形标记
'|':竖线标记
'_':横线标记
线条样式:
'-':实线 '--':虚线 '-.':点划线 ':':点线
6.2 figure 函数
figure() 函数来实例化 figure 对象,即绘制图形的对象,可以通过这个对象,来设置图形的样式等
参数:
-
figsize:指定画布的大小,(宽度,高度),单位为英寸
-
dpi:指定绘图对象的分辨率,即每英寸多少个像素,默认值为80
-
facecolor:背景颜色
-
dgecolor:边框颜色
-
frameon:是否显示边框
6.2.1 figure.add_axes()
Matplotlib 定义了一个 axes 类(轴域类),该类的对象被称为 axes 对象(即轴域对象),它指定了一个有数值范围限制的绘图区域。在一个给定的画布(figure)中可以包含多个 axes 对象,但是同一个 axes 对象只能在一个画布中使用。
参数:
是一个包含四个元素的列表或元组,格式为 [left, bottom, width, height],其中:
left 和 bottom 是轴域左下角的坐标,范围从 0 到 1。
width 和 height 是轴域的宽度和高度,范围从 0 到 1。
6.2.2 axes.legend()
legend 函数用于添加图例,以便识别图中的不同数据系列。图例会自动显示每条线或数据集的标签。
参数:
-
labels 是一个字符串序列,用来指定标签的名称,用列表形式表示
-
loc 是指定图例位置的参数,其参数值可以用字符串或整数来表示
-
handles 参数,它也是一个序列,它包含了所有线型的实例,用列表形式表示
#方法1
from matplotlib import pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
fig = plt.figure()
ax = fig.add_axes([0.1,0.1,0.8,0.8])
line1 = ax.plot(x,y1)
ax.legend(handles = [line1],labels = ['sin(x)'],loc = 'center')
plt.show()
#方法2(常用)
from matplotlib import pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
fig = plt.figure()
ax = fig.add_axes([0.1,0.1,0.8,0.8])
ax.plot(x,y1,label = 'sin(x)')
#激活图例
ax.legend(loc='upper right')
plt.show()
add_axes的参数是labels ,plot()的参数是label;
legend() 函数 loc 参数:
位置 | 字符串表示 | 整数数字表示 |
---|---|---|
自适应 | Best | 0 |
右上方 | upper right | 1 |
左上方 | upper left | 2 |
左下 | lower left | 3 |
右下 | lower right | 4 |
右侧 | right | 5 |
居中靠左 | center left | 6 |
居中靠右 | center right | 7 |
底部居中 | lower center | 8 |
上部居中 | upper center | 9 |
中部 | center | 10 |
6.3 标题中文乱码
如果标题设置的是中文,会出现乱码
局部处理:
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
全局处理:
首先,找到 matplotlibrc 文件的位置,可以使用以下代码:
import matplotlib
print(matplotlib.matplotlib_fname())
然后,修改 matplotlibrc 文件,找到 font.family 和 font.sans-serif 项,设置为支持中文的字体,如 SimHei。
同时,设置 axes.unicode_minus 为 False 以正常显示负号。
修改完成后,重启pyCharm。
6.4 subplot 函数
常用的是add_subplot(),用于向图形容器中添加子图。
fig.add_subplot(nrows, ncols, index)
- nrows:行数
- ncols:列数
- indeex:子图的索引,可以理解为对子图的编号
6.5 subplots 函数
subplots 是 matplotlib.pyplot 模块中的一个函数,用于创建一个包含多个子图(subplots)的图形窗口。subplots 函数返回一个包含所有子图的数组,这使得你可以更方便地对每个子图进行操作。
fig, axs = plt.subplots(nrows, ncols, figsize=(width, height))
参数:
-
nrows: 子图的行数。
-
ncols: 子图的列数。
-
figsize: 图形的尺寸,以英寸为单位。
-
figsize:画布大小
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
fig,axs = plt.subplots(1,3,figsize=(12,4))
axs[0].plot(x,y1)
axs[1].plot(x,y2)
axs[2].plot(x,y3)
plt.show()
6.6 subplot2gird 函数
subplot2grid 是 matplotlib.pyplot 模块中的一个函数,用于在网格中创建子图。subplot2grid 允许你更灵活地指定子图的位置和大小,以非等分的形式对画布进行切分,使得你可以创建复杂的布局。
ax = plt.subplot2grid(shape, loc, rowspan=1, colspan=1)
参数:
-
shape: 网格的形状,格式为 (rows, cols),表示网格的行数和列数,在figure中式全局设置。
-
loc: 子图的起始位置,格式为 (row, col),表示子图在网格中的起始行和列。
-
rowspan: 子图占据的行数,默认为 1。可以理解为有多少个相同的子图在垂直方向拼接在一起
-
colspan: 子图占据的列数,默认为 1。可以理解为有多少个相同的子图在水平方向拼接在一起
6.7 grid 函数
grid 是用于在图形中添加网格线的函数。网格线可以帮助读者更清晰地理解数据的分布和趋势。grid 函数可以应用于 Axes 对象,用于在子图中添加网格线。
ax.grid(b=None, which='major', axis='both', **kwargs)
参数:
-
b: 是否显示网格线,默认为 None,表示根据当前设置显示或隐藏网格线。
-
which: 指定要显示的网格线类型,可以是 'major'(主刻度)、'minor'(次刻度)或 'both'(主刻度和次刻度)。
-
axis: 指定要显示网格线的轴,可以是 'both'(两个轴)、'x'(X 轴)或 'y'(Y 轴)。
-
**kwargs: 其他可选参数,用于定制网格线的外观,如 color、linestyle、linewidth 等。
6.8 set_xscale 和 set_yscale 函数
xscale 和 yscale 函数用于设置坐标轴的刻度类型。默认情况下,坐标轴的刻度类型是线性的,但你可以使用 xscale 和 yscale 函数将其更改为对数刻度或其他类型的刻度。
ax.set_xscale(value)
ax.set_yscale(value)
参数:
value: 刻度类型,可以是 'linear'(线性刻度)、'log'(对数刻度)、'symlog'(对称对数刻度)、'logit'(对数几率刻度)等。
6.9 set_xlim 和 set_ylim 函数
set_xlim 和 set_ylim 函数用于设置坐标轴的范围。
ax.set_xlim(left, right)
ax.set_ylim(bottom, top)
参数:
-
left 和 right: X 轴的范围,left 是 X 轴的最小值,right 是 X 轴的最大值。
-
bottom 和 top: Y 轴的范围,bottom 是 Y 轴的最小值,top 是 Y 轴的最大值。
6.10 set_xticks 和 set_yticks 函数
Matplotlib 可以自动根据因变量和自变量设置坐标轴范围,也可以通过 set_xticks() 和 set_yticks() 函数手动指定刻度,接收一个列表对象作为参数,列表中的元素表示对应数轴上要显示的刻度。
ax.set_xticks(ticks)
ax.set_yticks(ticks)
参数:
ticks: 一个包含刻度位置的列表或数组。
6.11 twinx 和 twiny 函数
twinx 和 twiny 函数用于在同一个图形中创建共享 X 轴或 Y 轴的多个子图。twinx 函数用于创建共享 X 轴的子图,twiny 函数用于创建共享 Y 轴的子图。
ax2 = ax.twinx()
ax2 = ax.twiny()
说明:
-
ax: 原始的 Axes 对象。
-
ax2: 新的 Axes 对象,共享原始 Axes 对象的 X 轴或 Y 轴。
x = np.linspace(0,10,100)
y1 = np.sin(x)
y2 = np.cos(x)
fig,ax1 = plt.subplots()
ax1.plot(x,y1)
ax2 = ax1.twinx()
ax2.plot(x,y2)
plt.show()
6.12 柱状图
ax.bar(x, height, width=0.8, bottom=None, align='center', **kwargs)
参数:
-
x: 柱状图的 X 轴位置。
-
height: 柱状图的高度。
-
width: 柱状图的宽度,默认为 0.8。
-
bottom: 柱状图的底部位置,默认为 0。
-
align: 柱状图的对齐方式,可以是 'center'(居中对齐)或 'edge'(边缘对齐)。
-
**kwargs: 其他可选参数,用于定制柱状图的外观,如 color、edgecolor、linewidth 等。
一般的柱状图:
from matplotlib import pyplot as plt
# 给出初始数据
key = ['a','b','c','d']
value = [10,25,18,20]
fig,axs = plt.subplots()
axs.bar(key,value)
plt.show()
堆叠柱状图:
from matplotlib import pyplot as plt
key = ['a','b','c','d']
value01 = [12,34,14,25]
value02 = [29,16,25,10]
fig,axs = plt.subplots()
axs.bar(key,value01,color = 'b')
axs.bar(key,value02,color='g',bottom = value01)
plt.show()
分组柱状图:
from matplotlib import pyplot as plt
import numpy as np
# 数据准备
key = ['a','b','c','d']
value01 = [12,34,14,25]
value02 = [29,16,25,10]
# 创建图形和子图
fig,axs = plt.subplots()
# 计算柱状图的位置
x = np.arange(len(key))#用于对柱形的中心点定位
width = 0.4
axs.bar(x-width/2,value01,color = 'b',width=width)
axs.bar(x+width/2,value02,color = 'g',width=width)
plt.show()
6.13 直方图
ax.hist(x, bins=None, range=None,density=False, weights=None, cumulative=False, **kwargs)
参数:
-
x: 数据数组。
-
bins: 直方图的柱数,可以是整数或序列。
-
range: 直方图的范围,格式为 (min, max)。
-
density: 是否将直方图归一化,默认为 False。
-
weights: 每个数据点的权重。
-
cumulative: 是否绘制累积直方图,默认为 False。
-
**kwargs: 其他可选参数,用于定制直方图的外观,如 color、edgecolor、linewidth 等。
from matplotlib import pyplot as plt
import numpy as np
data = np.random.randn(1000)
fig,axs = plt.subplots()
axs.hist(data,bins = 100)
plt.show()
6.14 饼图
ax.pie(x, explode=None, labels=None, colors=None, autopct=None, shadow=False, startangle=0, **kwargs)
参数:
-
x: 数据数组,表示每个扇区的占比。
-
explode: 一个数组,表示每个扇区偏离圆心的距离,默认为 None。
-
labels: 每个扇区的标签,默认为 None。
-
colors: 每个扇区的颜色,默认为 None。
-
autopct: 控制显示每个扇区的占比,可以是格式化字符串或函数,默认为 None。
-
shadow: 是否显示阴影,默认为 False。
-
startangle: 饼图的起始角度,默认为 0。
-
**kwargs: 其他可选参数,用于定制饼图的外观。
from matplotlib import pyplot as plt
data = [32,45,62,10]
labels=['a','b','c','d']
fig,ax = plt.subplots()
ax.pie(data,labels=labels,autopct='%1.1f%%')
plt.show()
6.15 折线图
使用plot函数
from matplotlib import pyplot as plt
import numpy as np
x=np.linspace(0,10,100)
y=np.sin(x)
fig,axs = plt.subplots()
axs.plot(x,y)
plt.show()
6.16 散点图
ax.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, edgecolors=None, **kwargs)
参数:
-
x: X 轴数据。
-
y: Y 轴数据。
-
s: 点的大小,可以是标量或数组。
-
c: 点的颜色,可以是标量、数组或颜色列表。
-
marker: 点的形状,默认为 'o'(圆圈)。
-
cmap: 颜色映射,用于将颜色映射到数据。
-
norm: 归一化对象,用于将数据映射到颜色映射。
-
vmin, vmax: 颜色映射的最小值和最大值。
-
alpha: 点的透明度,取值范围为 0 到 1。
-
linewidths: 点的边框宽度。
-
edgecolors: 点的边框颜色。
-
**kwargs: 其他可选参数,用于定制散点图的外观。
marker常用的参数值:
-
'o': 圆圈
-
's': 正方形
-
'D': 菱形
-
'^': 上三角形
-
'v': 下三角形
-
'>': 右三角形
-
'<': 左三角形
-
'p': 五边形
-
'*': 星形
-
'+': 加号
-
'x': 叉号
-
'.': 点
-
',': 像素
-
'1': 三叉戟下
-
'2': 三叉戟上
-
'3': 三叉戟左
-
'4': 三叉戟右
-
'h': 六边形1
-
'H': 六边形2
-
'd': 小菱形
-
'|': 竖线
-
'_': 横线
6.13 图片读取
plt.imread 是 Matplotlib 库中的一个函数,用于读取图像文件并将其转换为 NumPy 数组。
参数
-
fname
: 图像文件的路径(字符串)。相对路径 -
format
: 图像格式(可选)。如果未指定,imread
会根据文件扩展名自动推断格式。
返回值
-
返回一个 NumPy 数组,表示图像的像素数据。数组的形状取决于图像的格式:
-
对于灰度图像,返回一个二维数组
(height, width)
。 -
对于彩色图像,返回一个三维数组
(height, width, channels)
,其中channels
通常是 3(RGB)或 4(RGBA)。颜色通道
-
利用plt.imshow()显示原始图片