一、Matplotlib库
1.1、简介
Matplotlib 是一个用于绘制图表和可视化数据的 Python 库。它提 供了一种类似于 MATLAB 的绘图接口,使用户能够轻松地生成各种 类型的图形,包括折线图、散点图、直方图、饼图等。Matplotlib 被广泛应用于数据分析、科学计算、工程和其他领域
1.2、特点
(1)易于上手:Matplotlib的API设计简洁,绘图流程清晰,初学者可以快速掌握。
(2)高度可定制:Matplotlib提供了丰富的绘图参数,用户可以根据需求调整图形 样式、颜色、字体等。
(3)支持多种数据源:Matplotlib可以处理多种数据格式,如列表、数组、Pandas 数据框等。
(4)跨平台:Matplotlib支持Windows、Linux和macOS等多个操作系统。
安装:pip install matplotlib
1.3、 图表(Figure)
在 Matplotlib 中,Figure
是一个顶层容器,用于包含图表中的所有元素。比如坐标轴、图例、标题、等
1.4、轴(Axes)
一个 Matplotlib 图表可以包含一个或多个 Axes
对象,每个 Axes
对象都是一个独立的坐标系,可以理解成一个子图
1.5、轴(Axis)
在 Matplotlib 中,Axis
这个词可以指代 坐标轴,即图表中的X轴和Y轴。这是用于定位和测量数据点位置的参考线
1.6、画家(Artist)
在 Matplotlib 中,Artist
是一个基础的图形元素对象,它代表了图表中的各种图形元素,如图形、文本、线条等。所有的图形元素,无论是图表本身、坐标轴、标签还是其他可见的部分,都是 Artist
对象
二、Matplotlib的基本使用
方法名 | 说明 |
---|---|
title() | 设置图表的名称 |
xlabel() | 设置x轴名称 |
ylabel() | 设置y轴名称 |
xticks(x,ticks,rotation) | 设置x轴的刻度,rotation旋转角度 |
yticks() | 设置y轴的刻度 |
plot() | 绘制线性图表 |
show() | 显示图表 |
legend() | 显示图例 |
text(x,y,text) | 显示每条数据的值 x,y值的位置 |
figure(name,figsize=(w,h),dpi=n) | 设置图片大小 |
import matplotlib.pyplot as plt
x=[1,2,3,4,5]
squares=[1,4,9,16,25]
plt.plot(x,squares)
plt.show()
import matplotlib.pyplot as plt
datas=[1,2,3,4,5]
squares=[1,4,9,16,25]
plt.plot(datas,squares,linewidth=5) #设置线条宽度
#设置图标标题,并在坐标轴上添加标签
plt.title('Numbers',fontsize=24)
plt.xlabel('datas',fontsize=14)
plt.ylabel('squares',fontsize=14)
plt.show()
三、中文乱码问题
查看系统内字体
from matplotlib.font_manager import fontManager as fm
for f in fm.ttflist:
if f.fname.find('simhei.ttf') != -1:
print(f.name,'===',f.fname)
临时增加字体
from matplotlib.font_manager import fontManager as fm
fm.addfont('./ali.ttf')
for f in fm.ttflist:
if f.fname.find('ali') != -1:
print(f.name,'===',f.fname)
设置字体
import matplotlib.pyplot as plt
#设置中文乱码问题
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['font.family']='SimHei'
单独设置字体
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
datas=[1,2,3,4,5]
squares=[1,4,9,16,25]
plt.plot(datas,squares) #设置线条宽度
#设置图标标题,并在坐标轴上添加标签
plt.title('标题设置',fontsize=24,fontdict={'fontproperties':FontProperties(fname='./ali.ttf')})
plt.xlabel('x轴',fontsize=14,fontdict={'family':'SimHei'})
plt.ylabel('y轴',fontsize=14,fontdict={'family':'SimHei'})
四、负数不显示问题
plt.rcParams['axes.unicode_minus'] = False
五、绘图
5.1、折线图
折线图是一种常用的数据可视化工具,它主要用于展示随时间或有序类别变化的数据趋势。
plt.plot(x, y, fmt, **kwargs)
名称 | 描述 | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
x | 这个参数是数据点的 x 轴坐标,可以是一个列表或者数组。如果 x 没有被指 定,那么它默认为 range(len(y))。 | ||||||||||||||||||
y | 这个参数是数据点的 y 轴坐标,同样可以是一个列表或者数组。 | ||||||||||||||||||
fmt | 这是一个可选的字符串参数,用于定义图形的颜色和样式。它由以下部分 组成:
| ||||||||||||||||||
**kwargs | 这是可选的关键字参数,用于进一步自定义图形的属性。常用的关键 字参数包括:
|
字符 | 类型 | 字符 | 类型 |
---|---|---|---|
- | 实线型 | V | 下三角型 |
-- | 虚线型 | ^ | 上三角型 |
-. | 虚点线型 | < | 左三角型 |
: | 点型 | > | 右三角型 |
. | 句号型 | 1 | 下三叉型 |
_ | 横线 | 2 | 上三叉型 |
o | 圆点型 | 3 | 左三叉型 |
s | 正方形 | 4 | 右三叉型 |
p | 五角型 | * | 星型 |
h | 六边形1 | H | 六边形2 |
+ | 加号型 | x | 乘号型 |
D | 菱形 | d | 瘦菱形 |
5.1.1、正弦图
import numpy as np
import matplotlib.pyplot as plt
# 计算曲线上的点的x和y坐标
x = np.arange(0, 3 * np.pi, 0.1)
y = np.sin(x)
# 使用Matplotlib绘制点,并添加fmt和kwargs属性
plt.plot(x, y, '-',
label='Sine Wave', # 图例标签
linewidth=2, # 线宽
color='blue', # 线的颜色
marker='o', # 标记样式
markersize=5, # 标记的大小
markeredgecolor='black', # 标记边缘的颜色
markeredgewidth=1, # 标记边缘的宽度
markerfacecolor='none', # 标记内部的颜色
alpha=0.5 # 透明度
)
# 显示图例
plt.legend()
# 显示图形
plt.show()
5.1.2、余弦
import numpy as np
import matplotlib.pyplot as plt
# 计算曲线上的点的x和y坐标
x = np.arange(0, 3 * np.pi, 0.1)
y = np.cos(x)
# 使用Matplotlib绘制点,并添加fmt和kwargs属性
plt.plot(x, y, '-',
label='Sine Wave', # 图例标签
linewidth=2, # 线宽
color='blue', # 线的颜色
marker='o', # 标记样式
markersize=5, # 标记的大小
markeredgecolor='black', # 标记边缘的颜色
markeredgewidth=1, # 标记边缘的宽度
markerfacecolor='none', # 标记内部的颜色
alpha=0.5 # 透明度
)
# 显示图例
plt.legend()
# 显示图形
plt.show()
5.1.3、气温变化图
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 1.准备数据
data=['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
x = [1,2,3,4,5,6,7]
max_data = [10, 11, 13, 11, 12, 12, 9]
min_data = [1, -2, 2, 5, 3, 2, 0]
# 绘制图表
plt.plot(x,max_data,label='最高温度',marker='o',mfc='w',linestyle='--',markeredgecolor='tab:orange')
plt.plot(x,min_data,label='最低温度',marker='*',mfc='w',linestyle=':',markeredgecolor='tab:green')
# 后续设置x轴刻度
plt.xticks(x,data)
# 显示图例
plt.legend()
# 设置网格
plt.grid(axis='y',linestyle='--',alpha=0.5)
# 设置y轴刻度
plt.yticks(range(-2,15,2))
# 设置标题
plt.title('一周温度变化图')
5.1.4、主要作用和适用场景:
-
显示趋势: 折线图非常适合展示数据随时间变化的趋势。通过将数据点连接起来,可以清晰地看到数据的增长、下降或波动趋势,帮助观察者理解数据的发展过程
-
突出波动和变化: 折线图可以有效地显示数据的波动和变化。观察者可以通过折线的上下波动来了解数据的不稳定性或周期性变化
-
比较多组数据: 如果你想比较多组数据在相同时间或 条件下的变化趋势,折线图是一个有用的工具。通过在同一图表上绘制多条折线,可以清晰地比较它们之间的差异
-
突出异常值: 折线图有助于识别数据中的异常值。当有一个数据点与其周围的趋势不一致时,很容易在折线图中看到这种异常
-
预测趋势: 基于历史数据的趋势,折线图可以用于预测未来的趋势。这对于业务决策和规划具有重要意义
-
显示周期性变化: 如果数据具有周期性的变化,例如季节性变化或周期性事件,折线图可以很好地展示这种周期性
5.2、条形图
条形图是一种常见的数据可视化工具,它主要用于比较不同类别之间的数据。
matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)
名称 | 描述 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
x | 条形中心的x坐标。这个参数可以是单个值或者一个列表,表示每个条形的中 心位置。 | ||||||||||||||||
height | 条形的高度。这通常是一个数值或者一个列表,表示每个条形的高度。 | ||||||||||||||||
width | 条形的宽度,默认为0.8。这可以是单个值,用于所有条形,或者一个列 表,用于指定每个条形的宽度。 | ||||||||||||||||
bottom | 条形的起始位置,默认为0。这可以是单个值或者一个列表,用于堆叠 条形图。 | ||||||||||||||||
align | 条形的对齐方式,可以是’center’(中心对齐,默认),‘edge’(左对 齐)。 | ||||||||||||||||
data | 如果提供了 data参数,则x和height参数可以指定为字符串,这些字符串 将被解释为pandas DataFrame列的名称。 | ||||||||||||||||
**kwargs | 其他关键字参数,包括:
|
5.2.1、普通条图
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
fruits = ['苹果', '蓝莓', '草莓', '橘子']
counts = [40, 100, 30, 55]
bar_labels = ['青红色', '蓝色', '红色', '橙色']
bar_colors = ['tab:red', 'tab:blue', 'orangered', 'tab:orange']
container = ax.bar(fruits, counts, label=bar_labels, color=bar_colors)
ax.bar_label(container)
ax.set_ylabel('水果数量')
ax.set_title('按种类和颜色划分的水果供应')
ax.legend(title='水果颜色')
5.2.2、横向条图
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
fruits = ['苹果', '蓝莓', '草莓', '橘子']
counts = [40, 100, 30, 55]
bar_labels = ['青红色', '蓝色', '红色', '橙色']
bar_colors = ['tab:red', 'tab:blue', 'orangered', 'tab:orange']
container = ax.barh(fruits, counts, label=bar_labels, color=bar_colors)
ax.bar_label(container)
ax.set_xlabel('水果数量')
ax.set_title('按种类和颜色划分的水果供应')
ax.legend(title='水果颜色')
5.2.3、多组条图
import matplotlib.pyplot as plt
species = ("苹果","蓝莓","橘子")
weight_counts = {
"第1季度": [70, 39, 58],
"第2季度": [82, 37, 66],
}
width = 0.2
x = range(len(species))
x1 =[i+width for i in x]
container = plt.bar(x, weight_counts["第1季度"],color='tab:red',label='第1季度',width=width)
plt.bar_label(container)
container2 = plt.bar(x1, weight_counts["第2季度"],color='tab:blue',label='第2季度',width=width)
plt.bar_label(container2)
plt.xticks([_+width/2 for _ in x], species)
plt.legend(loc=1)
5.2.4、堆叠条图
import matplotlib.pyplot as plt
species = ("苹果","蓝莓","橘子")
weight_counts = {
"第1季度": [70, 39, 58],
"第2季度": [82, 37, 66],
}
x = range(len(species))
container = plt.bar(x, weight_counts["第1季度"],color='tab:red',label='第1季度')
plt.bar_label(container,label_type='center')
container2 = plt.bar(x, weight_counts["第2季度"],color='tab:blue',label='第2季度',bottom=weight_counts["第1季度"])
plt.bar_label(container2,label_type='center')
plt.xticks([_+width/2 for _ in x], species)
plt.legend(loc="upper right")
5.2.5、主要作用和适用场景
-
比较类别之间的大小: 条形图适用于展示不同类别的数据量或大小,通过条形的长度直观地比较它们之间的差异
-
展示排名和排序: 条形图可以用于显示数据的排名顺序,使观察者能够很容易地识别出最大值、最小值以及中间的排名
-
展示分布情况: 当你想了解不同类别在整体中所占的比例或分布情况时,条形图是一种有效的选择。每个条形的长度代表相应类别的数据量,总和即为整体的总量
-
呈现时间趋势: 虽然折线图更适合显示时间趋势,但条形图也可用于呈现时间点上的数据,例如某个特定时间内的销售额或收益
-
对比多组数据: 类似于折线图,条形图也能用于对比多组数据,但通常是在不同类别上进行比较,而非随时间变化
-
突出异常值: 条形图可以突出显示数据的异常值,观察者可以很容易地识别出高于或低于平均水平的类别
5.3、直方图
直方图是一种用于展示数据分布情况的图表,主要用于描述数值型数据的频数分布。
hist(
x: ArrayLike | Sequence[ArrayLike],
bins: int | Sequence[float] | str | None = None,
range: tuple[float, float] | None = None,
density: bool = False,
weights: ArrayLike | None = None,
cumulative: bool | float = False,
bottom: ArrayLike | float | None = None,
histtype: Literal["bar", "barstacked", "step", "stepfilled"] = "bar",
align: Literal["left", "mid", "right"] = "mid",
orientation: Literal["vertical", "horizontal"] = "vertical",
rwidth: float | None = None,
log: bool = False,
color: ColorType | Sequence[ColorType] | None = None,
label: str | Sequence[str] | None = None,
stacked: bool = False,
*,
data=None,
**kwargs,
)
名称 | 描述 |
---|---|
x | (n,) 个数组或 (n,) 个数组序列 |
bins | 如果 bins 是整数,则它定义等宽 bin 的数量 在范围内。 如果 bins 是一个序列,则它定义 bin 边缘,包括 第一个 bin 的左边缘和最后一个 bin 的右边缘; 在这种情况下,分箱的间距可能不相等。除最后一个 (最右侧)垃圾桶是半开的。 |
range | 分箱的下限和上限范围。下限和上限异常值 被忽略。如果未提供,则 range 为 . 如果 bins 是一个序列,则 Range 不起作用。 |
density | 如果 ,draw 并返回一个概率密度:每个 bin 将显示素材箱的原始计数除以 counts 和 bin 宽度 ()、 ,使直方图下的面积积分为 1 (). |
weights | 一个权重数组,其形状与 x 相同。x 中的每个值仅将其关联的权重贡献给 bin 计数 (而不是 1)。如果 density 为 ,则权重为 归一化,以便 Density 在 仍为 1。 |
cumulative | 如果 ,则计算一个直方图,其中每个 bin 给出 该 bin 中的计数加上较小值的所有 bin。最后一个 bin 给出数据点的总数。 如果 density 也是,则直方图被归一化,例如 最后一个 bin 等于 1。 如果 cumulative 是小于 0 的数字(例如 -1),则方向 的积累被逆转。在这种情况下, 如果 density 也是 ,则对直方图进行归一化,以便第一个 bin 等于 1。 |
bottom | 每个 bin 底部的位置,即从 到 如果是标量,则从底部绘制 的移动量相同。如果是一个数组,则每个 bin 独立移动,并且底部长度必须与 数据桶数。如果为 None,则默认为 0 |
histtype |
|
align |
|
orientation | 如果为 'horizontal',则将用于条形直方图 底部 kwarg 将是左边缘。 |
rwidth | 条形的相对宽度,作为条柱宽度的分数。如果 ,则自动计算宽度。 如果 histtype 为 'step' 或 'stepfilled',则忽略。 |
log | 如果 ,则直方图轴将设置为对数刻度。 |
color | 颜色或颜色序列,每个数据集一个。默认 () 使用标准线条颜色序列。 |
label | 字符串或字符串序列以匹配多个数据集。酒吧 图表为每个数据集生成多个补丁,但只有第一个 Patch 会得到 标签,这样就可以按预期工作。 |
stacked | 如果 ,则多个数据相互堆叠 如果多个数据并排排列,如果 histtype 为 如果 histtype 为 'step' ,则 'bar' 或彼此重叠 |
data | 如果给定,则以下参数还接受 string ,即 解释为 if 是 中的键 |
**kwargs | 接受对应于 X 轴上的数据集 |
5.3.1、组距和组数
组距:每组数据的分割区域,例如1-5一组5-10一组。我们可以称数据的组距为5
组数:(最大数据-最小数据)/组距 一般会100条数据可分5-12组
5.3.2、 直方图
from matplotlib import pyplot as plt
from random import randint
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
data = [randint(1, 100) for _ in range(100)]
plt.hist(data,20,facecolor='tab:orange',edgecolor='white',alpha=0.5)
5.3.3、主要作用和适用场景
-
展示数据分布: 直方图可用于呈现数值型数据的分布情况,帮助观察者了解数据集中在哪个范围内、是否存在偏斜以及分布的形状
-
观察数据的集中趋势和离散程度: 通过直方图,你可以直观地看到数据的中心位置(集中趋势)和数据的分散程度(离散程度),从而更好地理解数据的整体特征
-
识别异常值: 直方图能够帮助你发现数据集中的异常值,即明显偏离主体的数值,这对于数据清理和异常值处理很有帮助
-
判断数据的对称性: 直方图的形状可以显示数据集的对称性或偏斜程度,有助于了解数据是正态分布还是偏斜分布
-
比较不同数据集之间的差异: 当你有多个数据集需要比较时,直方图可以清晰地展示它们的分布情况,帮助观察者理解它们之间的差异
-
确定数据的分组间隔: 在构建直方图时,选择适当的分组间隔对于准确地反映数据分布至关重要
5.4、箱图
箱图(Box Plot),又称为箱形图、箱线图、盒式图、盒状图或盒须图,是一种用于展示数据分布情况的统计图表
箱图通过显示数据的中位数、上下四分位数(Q1和Q3)、异常值和数据的分布范围,提供了对数据整体特征的直观认识。
boxplot(data)
5.4.1组成部分和特点
箱体(Box): 箱体代表数据集的四分位距,即上四分位数(Q3)和下四分位数(Q1)之间的区域。箱体的长度表示数据的分布范围,越长表示数据的变异性越大
中位数线(Median Line): 在箱体内部通常有一条横线,表示数据的中位数,即将数据集分为两半的位置
须(Whiskers): 须是延伸自箱体的线段,用于表示数据的整体范围。通常,须的长度限制在1.5倍的四分位距之内。超过这个范围的数据点被认为是潜在的异常值
异常值(Outliers): 箱图中的异常值是须之外的数据点,它们可能是数据中的极端值。异常值可以帮助识别数据中的离群观测
5.4.2、用途和适用场景
-
展示数据分布: 箱图可以清晰地展示数据集的整体分布情况,包括中位数、上下四分位数和异常值,提供了对数据分布形状的直观认识
-
观察中心位置和离散度: 通过箱图,可以轻松地识别数据的中位数和四分位数,帮助观察者了解数据的中心位置和变异性
-
检测异常值: 箱图有助于识别数据中的异常值,这些值可能是与数据集的整体分布不同的极端值
-
比较不同组别的数据分布: 箱图可以用于比较不同类别或组别的数据分布情况,从而观察它们之间的差异
-
评估对称性和偏斜: 箱图的形状有助于观察数据的对称性或偏斜,这对于了解数据的分布特征非常有用
-
用于统计分析和质量控制: 箱图常用于统计学分析和质量控制中,帮助决策者识别问题、制定策略和改进流程
import matplotlib.pyplot as plt
data = [randint(1,100) for i in range(100)]
data.append(-60)
plt.boxplot(data)
5.5、散点图
散点图是一种用于显示两个变量之间关系的图表,每个点代表数据集中的一个观测值。
scatter(x,y)
主要作用和适用场景
-
展示变量之间的关系: 散点图适用于展示两个变量之间的关系,帮助观察者了解它们之间的趋势、相关性或模式
-
识别趋势: 通过观察散点图中的点的分布,可以判断是否存在线性或非线性的趋势。这有助于理解变量之间的关联性
-
发现异常值: 散点图可以用于识别数据集中的异常值,即与其他数据点明显不同的观测值
-
比较不同群体或类别的关系: 如果数据可以按照不同的群体或类别划分,散点图可以用于比较这些群体或类别之间的变量关系
-
显示数据的分布: 在散点图中,密集的点集中通常表示较高的数据密度,反之表示较低的密度,从而有助于观察数据的分布情况
-
用于回归分析: 散点图是回归分析的重要工具,可以用于评估两个变量之间是否存在趋势,并用最佳拟合线(回归线)来描述这种趋势
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = [161.2, 167.5, 159.5, 157.0, 155.8, 170.0, 159.1, 166.0, 176.2, 160.2, 172.5, 170.9, 172.9, 153.4, 160.0, 147.2, 168.2, 175.0, 157.0, 167.6, 159.5, 175.0, 166.8, 176.5, 170.2, 174.0, 173.0, 179.9, 170.5, 160.0, 154.4, 162.0, 176.5, 160.0, 152.0, 162.1, 170.0, 160.2, 161.3, 166.4, 168.9, 163.8, 167.6, 160.0, 161.3, 167.6, 165.1, 160.0, 170.0, 157.5, 167.6, 160.7, 163.2, 152.4, 157.5, 168.3, 180.3, 165.5, 165.0, 164.5, 156.0, 160.0, 163.0, 165.7, 161.0, 162.0, 166.0, 174.0, 172.7, 167.6, 151.1, 164.5, 163.5, 152.0, 169.0, 164.0, 161.2, 155.0, 170.0, 176.2, 170.0, 162.5, 170.3, 164.1, 169.5, 163.2, 154.5, 159.8, 173.2, 170.0, 161.4, 169.0, 166.2, 159.4, 162.5, 159.0, 162.8, 159.0, 179.8, 162.9, 161.0, 151.1, 168.2, 168.9, 173.2, 171.8, 178.0, 164.3, 163.0, 168.5, 166.8, 172.7, 163.5, 169.4, 167.8, 159.5, 167.6, 161.2, 160.0, 163.2, 162.2, 161.3, 149.5, 157.5, 163.2, 172.7, 155.0, 156.5, 164.0, 160.9, 162.8, 167.0, 160.0, 160.0, 168.9, 158.2, 156.0, 160.0, 167.1, 158.0, 167.6, 156.0, 162.1, 173.4, 159.8, 170.5, 159.2, 157.5, 161.3, 162.6, 160.0, 168.9, 165.1, 162.6, 165.1, 166.4, 160.0, 152.4, 170.2, 162.6, 170.2, 158.8, 172.7, 167.6, 162.6, 167.6, 156.2, 175.2, 172.1, 162.6, 160.0, 165.1, 182.9, 166.4, 165.1, 177.8, 165.1, 175.3, 154.9, 158.8, 172.7, 168.9, 161.3, 167.6, 165.1, 175.3, 157.5, 163.8, 167.6, 165.1, 165.1, 168.9, 162.6, 164.5, 176.5, 168.9, 175.3, 159.4, 160.0, 170.2, 162.6, 167.6, 162.6, 160.7, 160.0, 157.5, 162.6, 152.4, 170.2, 165.1, 172.7, 165.1, 170.2, 170.2, 170.2, 161.3, 167.6, 167.6, 165.1, 162.6, 152.4, 168.9, 170.2, 175.2, 175.2, 160.0, 165.1, 174.0, 170.2, 160.0, 167.6, 167.6, 167.6, 154.9, 162.6, 175.3, 171.4, 157.5, 165.1, 160.0, 174.0, 162.6, 174.0, 162.6, 161.3, 156.2, 149.9, 169.5, 160.0, 175.3, 169.5, 160.0, 172.7, 162.6, 157.5, 176.5, 164.4, 160.7, 174.0, 163.8]
y = [51.6, 59.0, 49.2, 63.0, 53.6, 59.0, 47.6, 69.8, 66.8, 75.2, 55.2, 54.2, 62.5, 42.0, 50.0, 49.8, 49.2, 73.2, 47.8, 68.8, 50.6, 82.5, 57.2, 87.8, 72.8, 54.5, 59.8, 67.3, 67.8, 47.0, 46.2, 55.0, 83.0, 54.4, 45.8, 53.6, 73.2, 52.1, 67.9, 56.6, 62.3, 58.5, 54.5, 50.2, 60.3, 58.3, 56.2, 50.2, 72.9, 59.8, 61.0, 69.1, 55.9, 46.5, 54.3, 54.8, 60.7, 60.0, 62.0, 60.3, 52.7, 74.3, 62.0, 73.1, 80.0, 54.7, 53.2, 75.7, 61.1, 55.7, 48.7, 52.3, 50.0, 59.3, 62.5, 55.7, 54.8, 45.9, 70.6, 67.2, 69.4, 58.2, 64.8, 71.6, 52.8, 59.8, 49.0, 50.0, 69.2, 55.9, 63.4, 58.2, 58.6, 45.7, 52.2, 48.6, 57.8, 55.6, 66.8, 59.4, 53.6, 73.2, 53.4, 69.0, 58.4, 56.2, 70.6, 59.8, 72.0, 65.2, 56.6, 105.2, 51.8, 63.4, 59.0, 47.6, 63.0, 55.2, 45.0, 54.0, 50.2, 60.2, 44.8, 58.8, 56.4, 62.0, 49.2, 67.2, 53.8, 54.4, 58.0, 59.8, 54.8, 43.2, 60.5, 46.4, 64.4, 48.8, 62.2, 55.5, 57.8, 54.6, 59.2, 52.7, 53.2, 64.5, 51.8, 56.0, 63.6, 63.2, 59.5, 56.8, 64.1, 50.0, 72.3, 55.0, 55.9, 60.4, 69.1, 84.5, 55.9, 55.5, 69.5, 76.4, 61.4, 65.9, 58.6, 66.8, 56.6, 58.6, 55.9, 59.1, 81.8, 70.7, 56.8, 60.0, 58.2, 72.7, 54.1, 49.1, 75.9, 55.0, 57.3, 55.0, 65.5, 65.5, 48.6, 58.6, 63.6, 55.2, 62.7, 56.6, 53.9, 63.2, 73.6, 62.0, 63.6, 53.2, 53.4, 55.0, 70.5, 54.5, 54.5, 55.9, 59.0, 63.6, 54.5, 47.3, 67.7, 80.9, 70.5, 60.9, 63.6, 54.5, 59.1, 70.5, 52.7, 62.7, 86.3, 66.4, 67.3, 63.0, 73.6, 62.3, 57.7, 55.4, 104.1, 55.5, 77.3, 80.5, 64.5, 72.3, 61.4, 58.2, 81.8, 63.6, 53.4, 54.5, 53.6, 60.0, 73.6, 61.4, 55.5, 63.6, 60.9, 60.0, 46.8, 57.3, 64.1, 63.6, 67.3, 75.5, 68.2, 61.4, 76.8, 71.8, 55.5, 48.6, 66.4, 67.3]
plt.scatter(x, y,color='tab:blue',alpha=0.5)
5.6、饼图
饼图(Pie Chart)是一种常见的数据可视化图表,主要用于展示数据的相对比例。饼图通过将整体分割成扇形,每个扇形的角度大小表示相应类别的数据占总体的比例。
pie(data)
主要作用和适用场景
-
显示相对比例: 饼图最主要的作用是显示不同类别或部分的数据在整体中所占的相对比例,通过扇形的大小直观地表达这些比例关系
-
强调部分与整体的关系: 饼图适用于突出各部分数据在整体中的比重,使观察者更容易理解每个类别对总体的贡献程度
-
用于少量类别的数据: 饼图通常适用于展示少量(2-7个)类别的数据,因为过多的扇形会使图表复杂难以解读
-
比较各类别的重要性: 饼图允许观察者直观比较各类别的相对重要性,即使这些类别的数值较小也能清晰呈现
5.6.1、常规饼图
labels = ['鱼', '猫', '狗', '鹦鹉']
sizes = [15, 30, 45, 10]
plt.pie(sizes,labels=labels,autopct='%1.1f%%',colors=['tab:red','tab:blue','tab:green','tab:orange'])
plt.legend()
5.6.2、设置字体
labels = '鱼', '猫', '狗', '鹦鹉'
sizes = [15, 30, 45, 10]
plt.pie(sizes,labels=labels,autopct='%1.1f%%',
textprops={'fontsize':20,'color':'tab:blue'})
plt.legend()
5.6.3、互换内容位置
labels = '鱼', '猫', '狗', '鹦鹉'
sizes = [15, 30, 45, 10]
plt.pie(sizes,labels=labels,
pctdistance=1.2, # 设置值距离圆心的距离
labeldistance=0.6, # 设置标签距离圆心的距离
autopct='%1.1f%%',colors=['tab:red','tab:blue','tab:green','tab:orange'])
plt.legend()
5.6.4、分离扇区
labels = '鱼', '猫', '狗', '鹦鹉'
sizes = [15, 30, 45, 10]
explode = (0, 0.1, 0.1, 0)
plt.pie(sizes,labels=labels,
explode=explode, # 设置扇形的偏移量
autopct='%1.1f%%',colors=['tab:red','tab:blue','tab:green','tab:orange'])
plt.legend(loc='best')
5.6.5、 空心饼图
labels = '鱼', '猫', '狗', '鹦鹉'
sizes = [15, 30, 45, 10]
explode = (0, 0.1, 0.1, 0)
plt.pie(sizes,labels=labels,
wedgeprops={'width':0.4},# 设置空心
pctdistance=0.8, # 设置标签距离圆心的距离
explode=explode, # 设置扇形的偏移量
autopct='%1.1f%%',colors=['tab:red','tab:blue','tab:green','tab:orange'])
plt.legend(loc='best')
5.7、热力图
热力图(Heatmap)是一种通过颜色编码来显示数据矩阵中各元素相对值的图表,它主要用于呈现数据的相对密度、强度或关联程度。
imshow(data)
主要作用和适用场景
-
显示数据矩阵的模式: 热力图适用于显示数据矩阵中各元素之间的相对关系,通过颜色的深浅反映元素的相对值大小
-
可视化关联程度: 热力图能够清晰地表达不同元素之间的关联程度,特别是在表示相关性矩阵或相似性矩阵时,颜色的变化可以直观地展示变量之间的相关性
-
观察趋势和模式: 热力图在时间序列分析中常用于观察数据的趋势和模式。时间和另一个维度的数据可以在热力图中以两个轴展示,颜色则表示数据的强度
-
聚类分析: 热力图可用于辅助聚类分析,帮助观察者识别数据集中的分组或模式,尤其是在生物学、金融和市场研究等领域
-
异常值检测: 通过热力图,可以识别数据中的异常值,因为异常值通常在热力图中表现为与其他元素不同颜色的点
-
地理信息可视化: 热力图可以用于可视化地理信息数据,如人口密度、温度分布等,通过颜色的变化呈现不同地区的相对值
-
可视化深度学习中的权重: 在深度学习中,热力图常被用于可视化神经网络的权重,以便更好地理解网络的学习过程
常规热力图
days = [
'Saturday', 'Friday', 'Thursday',
'Wednesday', 'Tuesday', 'Monday', 'Sunday'
]
hours = [
'12a', '1a', '2a', '3a', '4a', '5a', '6a',
'7a', '8a', '9a', '10a', '11a',
'12p', '1p', '2p', '3p', '4p', '5p',
'6p', '7p', '8p', '9p', '10p', '11p'
]
data = [
[5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 1, 1, 3, 4, 6, 4, 4, 3, 3, 2, 5],
[7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 2, 2, 6, 9, 11, 6, 7, 8, 12, 5, 5, 7, 2],
[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 1, 9, 8, 10, 6, 5, 5, 5, 7, 4, 2, 4],
[7, 3, 0, 0, 0, 0, 0, 0, 1, 0, 5, 4, 7, 14, 13, 12, 9, 5, 5, 10, 6, 4, 4, 1],
[1, 3, 0, 0, 0, 1, 0, 0, 0, 2, 4, 4, 2, 4, 4, 14, 12, 1, 8, 5, 3, 7, 3, 0],
[2, 1, 0, 3, 0, 0, 0, 0, 2, 0, 4, 1, 5, 10, 5, 7, 11, 6, 0, 5, 3, 4, 2, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 1, 3, 4, 0, 0, 0, 0, 1, 2, 2, 6]
]
# 绘制热力图
plt.imshow(data)
带样式
# 创建画布
plt.figure(figsize=(20,10))
# 绘制热力图
plt.imshow(data,cmap='rainbow')
# 设置x轴刻度
plt.xticks(range(24),hours)
# 设置y轴刻度
plt.yticks(range(7),days)
# 显示颜色条
plt.colorbar()
# 显示数值
for i,d in enumerate(data):
for j,h in enumerate(d):
plt.text(j,i,data[i][j],ha='center',va='center',color='w')
5.8、3D图
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
x = np.linspace(-20, 20, 20)
y = np.linspace(-20, 20, 20)
x, y = np.meshgrid(x, y)
z = x**2 + y**2
# 创建3D图形
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 绘制曲面图
ax.plot_surface(x, y, z, cmap='viridis')
# 设置标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# 显示图形
plt.show(block=True)
5.8.1、置画布为3D
# 绘制图形
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
5.8.2、3D折线图
# 绘制3D折线图
# 准备数据
x = [1, 2, 3, 4, 5, 6, 7]
y = [3, 5, 6, 15, 17, 18, 2]
z = [1, 2, 3, 4, 5, 6, 7]
# 绘制图形
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
plt.plot(x, y, z)
5.8.3、3D散点图
x = [randint(1,20) for i in range(100)]
y = [randint(1,20) for i in range(100)]
z = [randint(1,20) for i in range(100)]
# 绘制图形
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
plt.scatter(x, y, z, color='tab:red', marker='*')
5.8.4、3D条图
x = range(3)
# 绘制条图
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
colors = ['tab:red', 'tab:blue', 'tab:green']
for i in x:
y = [randint(1,20) for i in range(6)]
z = [randint(5,20) for i in range(6)]
plt.bar(y, z, zs=i,zdir='x', alpha=0.8,width=1.8,color=[colors[i] for _ in range(6)])
plt.xticks(range(0,3,1))
ax.set_xlabel('x轴')
ax.set_ylabel('y轴')
ax.set_zlabel('z轴')
5.9、其他函数
5.9.1、xlabel
在matplotlib中, plt.xlabel() 函数用于为当前活动的坐标轴(Axes)设置x轴的 标签。当你想要标识x轴代表的数据或单位时,这个函数非常有用。
plt.xlabel('xlabel text')
5.9.2、ylabel
在matplotlib中, plt.ylabel() 函数用于为当前活动的坐标轴(Axes)设置y轴的 标签。当你想要标识y轴代表的数据或单位时,这个函数非常有用。
plt.ylabel('ylabel text')
5.9.3、title
在matplotlib中, title 函数用于为当前活动的坐标轴(Axes)设置图表的标题。 标题通常位于图表的顶部中央,用于简要描述图表的内容。
plt.title('Chart Title')
import numpy as np
import matplotlib.pyplot as plt
# 计算曲线上的点的x和y坐标
x = np.arange(0, 3 * np.pi, 0.1)
y = np.sin(x)
# 使用Matplotlib绘制点,并添加fmt和kwargs属性
plt.plot(x, y,
label='Sine Wave', # 图例标签
linewidth=2, # 线宽
linestyle='-', # 线型
color='blue', # 线的颜色
marker='o', # 标记样式
markersize=5, # 标记的大小
markeredgecolor='black', # 标记边缘的颜色
markeredgewidth=1, # 标记边缘的宽度
markerfacecolor='none', # 标记内部的颜色
alpha=0.5 # 透明度
)
# 显示x轴标签
plt.xlabel('x')
plt.ylabel('y')
plt.title('Sine Wave')
# 显示图例
plt.legend()
# 显示图形
plt.show()
5.9.4、subplot
在 Matplotlib 中, subplot函数用于在一个图形窗口( 局,每个子图布局区域对应一个 Figure)中创建多个子图布 Axes对象,通过该 Axes对象可以进行数据绘制操 作,使用 subplot 可以在网格中安排这些子图。
plt.subplot(nrows, ncols, plot_number)
名称 | 描述 |
---|---|
nrows | 子图的行数 |
ncols | 子图的列数 |
plot_number | 当前子图的编号,从1开始,从左上角到右下角按行优先顺序递 增。 |
import numpy as np
import matplotlib.pyplot as plt
# 创建数据
x = np.arange(0, 3 * np.pi, 0.01)
y_sin = np.sin(x)
y_cos = np.cos(x)
# 在第一个位置创建子图
plt.subplot(2, 2, 1) # 2行1列,第一个子图
plt.plot(x, y_sin)
plt.title('Sine Wave')
plt.xlabel('x')
plt.ylabel('y_sin')
# 在第二个位置创建子图
plt.subplot(2, 2, 2) # 2行1列,第二个子图
plt.plot(x, y_cos)
plt.title('Cosine Wave')
plt.xlabel('x')
plt.ylabel('y_cos')
# 调用 tight_layout 来自动调整子图参数
plt.tight_layout()
# 显示图形
plt.show()
六、Figure的用法
在 Matplotlib 中, Figure对象是整个绘图的顶级容器,它是所有绘图元素的基础, 提供了一个用于绘制图形的画布空间。
在 Matplotlib 中, Axes对象是进行数据绘制和设置坐标轴等操作的核心区域,它与 Figure对象紧密相关,共同构建了完整的绘图体系。
创建Figure对象和 Axes:
1、隐式创建:当直接调用绘图函数(如plt.plot())而没有预先创建 Figure 对象时,Matplotlib 会自动隐式创建一个Figure对象和一个Axes对象。
2、显式创建:使用函数来手动创建一个 Figure对象。
6.1、创建Figure对象
6.1.1、figure
在Matplotlib 中, figure 函数用于创建一个新的图形窗口,或者获取当前活跃的图 形窗口。每个图形窗口可以包含一个或多个坐标轴(Axes),可以在其上绘制数 据。
plt.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True, clear=False, **kwargs)
名称 | 描述 |
---|---|
num | 可选参数,指定图形窗口的编号或名称。如果 num 为 新的图形窗口。如果 None,则创建一个 num 已经存在,则获取该图形窗口。 |
figsize | 可选参数,指定图形窗口的大小,以英寸为单位。默认为None,使用 Matplotlib 的默认值。 |
dpi | 可选参数,指定图形的分辨率,以点每英寸为单位。默认为 None,使用 Matplotlib 的默认值。 |
facecolor | 可选参数,指定图形窗口的背景颜色。默认None,使用为 Matplotlib 的默认值。 |
edgecolor | 可选参数,指定图形窗口的边缘颜色。默认为 None,使用 Matplotlib 的默认值。 |
frameon | 可选参数,布尔值,指定是否绘制图形窗口的边框。默认为True |
clear | 可选参数,布尔值,指定是否清除图形窗口中的内容。默认为False |
**kwargs | 其他关键字参数,用于进一步自定义图形窗口的属性。 |
import matplotlib.pyplot as plt
plt.plot([0, 1], [1, 2])
fig = plt.figure(num=1, clear=True)
plt.plot([0, 1], [2, 3])
plt.show()
6.1.2、subplots
在Matplotlib中, subplots用于创建包含多个子图(subplot)的图形。这允许你在 同一个 Figure 对象内组织多个图表,从而方便地比较数据或者展示多方面的信息。
fig, axs = matplotlib.pyplot.subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True, width_ratios=None, height_ratios=None, subplot_kw=None, gridspec_kw=None)
名称 | 描述 |
---|---|
nrows=1 | 子图的行数,设置为1,表示创建一个子图的行。 |
ncols=1 | 子图的列数,设置为1,表示创建一个子图的列。 |
sharex=False | 布尔值,设置为False,表示子图之间不共享x轴刻度。每个子图 都有自己的x轴。 |
sharey=False | 布尔值,设置为False,表示子图之间不共享y轴刻度。每个子图 都有自己的y轴。 |
squeeze=True | 布尔值,设置为True,表示如果只创建了一个子图,则返回一 个子图对象而不是一个只包含一个子图对象的数组。 |
width_ratios=None | 列宽比例的序列,设置为None表示默认比例。如果提供 序列,它将用于调整各列的宽度比例。 |
height_ratios=None | 行高比例的序列,设置为None表示默认比例。如果提供 序列,它将用于调整各行的高度比例。 |
subplot_kw=None | 字典,设置为None,表示没有额外的关键字参数传递给 add_subplot调用。如果需要,可以传递一个字典来设置子图的属性。 |
gridspec_kw=None | 字典,设置为None,表示没有额外的关键字参数传递给 GridSpec对象。如果需要,可以传递一个字典来控制子图的布局。 |
import numpy as np
import matplotlib.pyplot as plt
# 创建数据
x = np.arange(-10, 10, 0.01)
y1 = np.sin(x) + 100
y2 = np.cos(x)
y3 = np.tan(x)
y4 = 1 / (1 + np.exp(-x)) # Sigmoid function
# 创建一个 2x2 的子图网格
fig, axs = plt.subplots(2, 2)
# 第一个子图
axs[0, 0].plot(x, y1)
axs[0, 0].set_title('Sine Wave')
axs[0, 0].set_xlabel('X-axis')
axs[0, 0].set_ylabel('Y-axis')
# 第二个子图
axs[0, 1].plot(x, y2)
axs[0, 1].set_title('Cosine Wave')
axs[0, 1].set_xlabel('X-axis')
axs[0, 1].set_ylabel('Y-axis')
# 第三个子图
axs[1, 0].plot(x, y3)
axs[1, 0].set_title('Tangent Wave')
axs[1, 0].set_xlabel('X-axis')
axs[1, 0].set_ylabel('Y-axis')
# 第四个子图
axs[1, 1].plot(x, y4)
axs[1, 1].set_title('Sigmoid Function')
axs[1, 1].set_xlabel('X-axis')
axs[1, 1].set_ylabel('Y-axis')
# 调整子图间距
plt.tight_layout()
# 显示图形
plt.show()
6.2、常用的Figure对象的方法
6.2.1、add_subplot
fig.add_subplot(nrows, ncols, plot_number)
名称 | 描述 |
---|---|
nrows | 子图的总行数。 |
ncols | 子图的总列数。 |
plot_number | 当前子图在其所在布局中的位置,从1开始计数,从左上角到右 下角。 |
该函数会返回一个 Axes 对象。
import matplotlib.pyplot as plt
# 创建一个图形窗口
fig = plt.figure()
# 添加第一个子图,位于2行1列布局中的第1个位置
ax1 = fig.add_subplot(2, 1, 1)
ax1.plot([0, 1], [0, 1])
ax1.set_title('00')
# 添加第二个子图,位于2行1列布局中的第2个位置
ax2 = fig.add_subplot(2, 1, 2)
ax2.plot([0, 1], [1, 0])
ax2.set_title('01')
plt.tight_layout()
# 显示图形
plt.show()
6.2.2、add_axes
该函数允许你在图形( Figure)中的任意位置添加一个子图(Axes)。与subplots 或 add_subplot 不同,add_axes允许你精确地指定子图的位置和大小。
matplotlib.figure.Figure.add_axes(rect, **kwargs)
名称 | 描述 |
---|---|
rect | 一个形如 [左边界, 底边界, 宽度, 高度] 的列表,指定子图的位置和大 小。这些值是在归一化坐标中的,其中 0 表示图形的左边界,1 表示右边界,0 表示底部,1 表示顶部。 |
**kwargs | 其他可选的关键字参数,用于控制子图的属性。 |
import matplotlib.pyplot as plt
# 创建一个图形
fig = plt.figure()
# 添加一个子图,位置是图形左下角的1/4处,大小为图形宽度的1/2和高度的1/2
ax = fig.add_axes([0.5, 0.1, 0.5, 0.5])
# 使用这个子图绘制一些数据
ax.plot([0, 1], [0, 1])
# 显示图形
plt.show()
6.2.3、suptitle
该函数用于在图形( Figure)上添加一个中心对齐的标题,这个标题位于所有子图 (Axes)的顶部。使用 suptitle 可以为整个图形设置一个总标题,而不仅仅是单 个子图。
matplotlib.figure.Figure.suptitle(t, **kwargs)
名称 | 描述 |
---|---|
t | 字符串,表示要添加的标题文本。 |
**kwargs | 其他可选的关键字参数,用于控制标题的样式,如字体大小 (fontsize)、颜色( color)等。 |
import matplotlib.pyplot as plt
# 创建一个图形
fig = plt.figure()
# 在图形上添加两个子图
ax1 = fig.add_subplot(121) # 第一个子图,两行一列的第一个位置
ax2 = fig.add_subplot(122) # 第二个子图,两行一列的第二个位置
# 使用第一个子图绘制一些数据
ax1.plot([0, 1], [0, 1])
ax1.set_title('ax1')
# 使用第二个子图绘制一些数据
ax2.plot([0, 1], [1, 0])
ax2.set_title('ax2')
# 为整个图形添加一个总标题
fig.suptitle('Test Suptitle', fontsize=16, color='red')
# 显示图形
plt.show()
6.2.4、text
该函数用于在图表的任意位置添加文本,通常在 的指定坐标位置上放置文本。
matplotlib.axes.Axes.text(x, y, s, **kwargs)
名称 | 描述 |
---|---|
x, y | 浮点数或数组,指定文本的位置坐标。 |
s | 字符串,要添加的文本内容。 |
**kwargs | 其他可选的关键字参数,用于控制文本的样式,如 体大小)、 color(颜色)、 fontsize(字 horizontalalignment(水平对齐方式,如 ‘left’, ‘center’, ‘right’)、 verticalalignment(垂直对齐方式,如 ‘top’, ‘center’, ‘bottom’)等。 |
import matplotlib.pyplot as plt
# 创建一个图形和一个子图
fig, ax = plt.subplots()
# 绘制一些数据
ax.plot([0, 1, 2], [0, 1, 0])
# 在坐标 (1, 0.5) 处添加文本
ax.text(1, 0.5, 'Sample Text', fontsize=12, color='red',
horizontalalignment='right', verticalalignment='top')
# 显示图形
plt.show()
6.2.5、axes
在 matplotlib中,如果你想要获取一个图形(Figure)中的所有轴(Axes )你可以査看 Figure 对象的 axes 属性。
import matplotlib.pyplot as plt
# 创建一个图形和一个子图
fig, ax = plt.subplots(2, 2)
# 获取图形中的所有轴
axes = fig.axes
# axes 是一个包含所有轴的列表
for ax in axes:
# 包含了每一个轴的x和y的相对位置(从左下角开始计算)、轴的宽度和高度(相对于整个图形)
print(ax)
# 显示图像
plt.show()
6.2.6、get_facecolor
该函数是一个用于获取轴(Axes)或填充区域(Patch)背景色的方法。具体来说, 它返回一个表示颜色的 RGBA 元组,其中 RGBA 分别代表红色、绿色、蓝色和 alpha(透明度)值。这些值通常在 0 到 1 的范围内。
import matplotlib.pyplot as plt
# 创建一个图形
fig = plt.figure(figsize=(8, 6), facecolor='blue')
# 获取背景色
facecolor = fig.get_facecolor()
print(facecolor)
# 显示图像
plt.show()
6.2.7、get_dpi
该方法用于获取图形(Figure)对象的分辨率。
import matplotlib.pyplot as plt
# 创建一个图形对象
fig = plt.figure(dpi=120)
# 获取图形的DPI
dpi = fig.get_dpi()
print(f"The DPI of the figure is: {dpi}")
# 显示图像
plt.show()
6.2.8、get_gca
该函数是 “get current axis” 的缩写,它用于获取当前图形(figure)中的当前坐标 轴(axis)对象。这个函数非常有用,因为它允许你访问并修改当前活动的坐标轴的 属性。
import matplotlib.pyplot as plt
# 创建一个图形和坐标轴
plt.figure()
plt.plot([1, 2, 3], [1, 2, 3])
# 获取当前坐标轴
ax = plt.gca()
# 使用坐标轴对象进行自定义
ax.set_title('Sample Plot')
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
# 显示图形
plt.show()
6.2.9、get_label
该方法用于获取坐标轴(例如,线和柱状图)的标签。这个方法通常用于获取已经设 置好的标签,以便于后续的检查或修改。
import matplotlib.pyplot as plt
# 创建一些数据
x = [1, 2, 3]
y = [1, 2, 3]
# 绘制线图并设置标签
line, = plt.plot(x, y, label='Line 1')
# 获取线的标签
label = line.get_label()
print('Label of the line:', label)
# 显示图形和图例
plt.legend()
plt.show()
6.2.10、get_size_inches
该方法用于获取图形的大小,以英寸为单位。
import matplotlib.pyplot as plt
# 创建一个图形对象,可以指定大小(宽度,高度)单位为英寸
fig = plt.figure(figsize=(8.0, 6.0))
# 使用 get_size_inches() 方法获取图形的大小
size_in_inches = fig.get_size_inches()
print('Size of the figure in inches:', size_in_inches)
# 绘制一些数据
plt.plot([1, 2, 3], [1, 2, 3])
# 显示图形
plt.show()
6.2.11、set_size_inches
该方法用于设置图形对象的大小,单位为英寸。这个方法允许用户在创建图形后改变 其尺寸,从而影响输出图像的分辨率和显示效果。
matplotlib.figure.Figure.set_size_inches(width, height, forward=True)
名称 | 描述 |
---|---|
width, height | 浮点数,指定图形的宽度和高度,单位为英寸。 |
forward | 布尔值,默认为 True。如果为 True,则在调整图形大小时,同时 更新所有子图的大小和位置。如果为 False,则仅改变图形的大小,而不更新子 图。 |
import matplotlib.pyplot as plt
# 创建一个图形对象
fig = plt.figure(figsize=(2, 2))
# 使用 set_size_inches 方法设置图形的大小
fig.set_size_inches(10, 6) # 设置宽度为10英寸,高度为6英寸
# 绘制一些数据
plt.plot([1, 2, 3], [1, 2, 3])
# 显示图形
plt.show()
6.2.12、set_dpi
该方法用于设置图形对象的分辨率,单位为每英寸点数(Dots Per Inch, DPI)。这 个方法影响输出图像的质量和文件大小,通常与 精确控制图形的尺寸和输出质量。
matplotlib.figure.Figure.set_dpi(dpi)
名称 | 描述 |
---|---|
dpi | 一个浮点数或整数,指定图形的分辨率,即每英寸的点数。 |
import matplotlib.pyplot as plt
# 创建一个图形对象
fig, ax = plt.subplots()
# 设置图形的尺寸为 6x4 英寸
fig.set_size_inches(10, 6)
# 使用 set_dpi 方法设置图形的分辨率
fig.set_dpi(200) # 设置分辨率为 100 DPI
# 绘制一些数据
ax.plot([1, 2, 3], [1, 2, 3])
print(fig.get_size_inches())
print(fig.get_dpi())
# 显示图形
plt.show()
6.2.13、tight_layout
该函数用于自动调整子图参数,使之填充整个图像区域,同时确保子图之间的标签和 标题不会重叠。这个方法对于创建布局整齐的图形非常有用,尤其是在子图较多或标 签较长时。
import matplotlib.pyplot as plt
# 创建一个包含多个子图的图形
fig, axs = plt.subplots(2, 2)
# 在每个子图中绘制一些数据
axs[0, 0].plot([1, 2, 3], [1, 2, 3])
axs[0, 0].set_title('00')
axs[0, 0].set_xlabel('x')
axs[0, 0].set_ylabel('y')
axs[0, 1].plot([1, 2, 3], [3, 2, 1])
axs[0, 1].set_title('01')
axs[0, 1].set_xlabel('x')
axs[0, 1].set_ylabel('y')
axs[1, 0].plot([1, 2, 3], [1, 3, 2])
axs[1, 0].set_title('10')
axs[1, 0].set_xlabel('x')
axs[1, 0].set_ylabel('y')
axs[1, 1].plot([1, 2, 3], [2, 1, 3])
axs[1, 1].set_title('11')
axs[1, 1].set_xlabel('x')
axs[1, 1].set_ylabel('y')
# 使用 tight_layout 自动调整子图布局
plt.tight_layout()
# 显示图形
plt.show()
6.2.14、subplots_adjust
该函数允许用户手动调整子图之间的空间,以及子图与图形边缘之间的空间。这个方 法提供了比 tight_layout 更细粒度的控制,特别适用于需要精确控制布局的情 况。
fig.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)
名称 | 描述 |
---|---|
left | 子图区域左边缘与图形左边缘之间的距离,范围从 0 到 1。 |
bottom | 子图区域下边缘与图形下边缘之间的距离,范围从 0 到 1。 |
right | 子图区域右边缘与图形右边缘之间的距离,范围从 0 到 1。 |
top | 子图区域上边缘与图形上边缘之间的距离,范围从 0 到 1。 |
wspace | 子图之间的水平间距,范围从 0 到 1。 |
hspace | 子图之间的垂直间距,范围从 0 到 1。 |
import matplotlib.pyplot as plt
# 创建一个包含多个子图的图形
fig, axs = plt.subplots(2, 2)
# 在每个子图中绘制一些数据
axs[0, 0].plot([1, 2, 3], [1, 2, 3])
axs[0, 1].plot([1, 2, 3], [3, 2, 1])
axs[1, 0].plot([1, 2, 3], [1, 3, 2])
axs[1, 1].plot([1, 2, 3], [2, 1, 3])
# 使用 subplots_adjust 手动调整子图布局
plt.subplots_adjust(left=0.1, right=0.7, top=0.9, bottom=0.1, hspace=0.2, wspace=0.2)
# 显示图形
plt.show()
6.2.15、clear
在matplotlib库中, Axes对象(代表绘图区域)和 都有clear函数。 Axes对象的 Figure对象(代表整个图形) clear函数主要用于清除该轴(子图)上的所有图形 元素,包括线条、标记、文本、图像等; Figure对象的 clear函数用于清除整个图 形中的所有子图和其他相关元素
import matplotlib.pyplot as plt
# 创建一个包含多个子图的图形
fig, axs = plt.subplots(2, 2)
# 在每个子图中绘制一些数据
axs[0, 0].plot([1, 2, 3], [1, 2, 3])
axs[0, 1].plot([1, 2, 3], [3, 2, 1])
axs[1, 0].plot([1, 2, 3], [1, 3, 2])
axs[1, 1].plot([1, 2, 3], [2, 1, 3])
# 使用 tight_layout 自动调整子图布局
fig.tight_layout()
# # Axes对象的clear
# axs[0, 0].clear()
# Figure对象的clear
fig.clear()
# 显示图形
plt.show()
6.3、其他函数
6.3.1、clf
与Figure对象的clear方法的作用类似,但clf归属于pyplot库,而不是Figure对象的方 法。
import matplotlib.pyplot as plt
# 创建一个包含多个子图的图形
fig, axs = plt.subplots(2, 2)
# 在每个子图中绘制一些数据
axs[0, 0].plot([1, 2, 3], [1, 2, 3])
axs[0, 1].plot([1, 2, 3], [3, 2, 1])
axs[1, 0].plot([1, 2, 3], [1, 3, 2])
axs[1, 1].plot([1, 2, 3], [2, 1, 3])
# 使用 tight_layout 自动调整子图布局
fig.tight_layout()
# # Axes对象的clear
# axs[0, 0].clear()
# pyplot库下的clf()
plt.clf()
# 显示图形
6.3.2、gcf
该函数用于返回当前活动的图形(figure)对象。
matplotlib.pyplot.gcf()
返回当前活动的 Figure 对象。如果没有活动的图形,这个函数将创建一个新的 图形,并将其作为当前活动的图形返回。 |
使用场景:
1、当你需要在脚本中获取或操作当前图形时, plt.gcf() 非常有用。
2、它允许你访问和修改当前图形的属性,比如大小、标题、背景颜色等。
3、你可以使用返回的 Figure 对象来添加新的子图(axes)、调整布局、保存图形 到文件等。
import matplotlib.pyplot as plt
# 创建一个新的图形和子图
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [1, 2, 3])
# 获取当前活动的图形对象
current_fig = plt.gcf()
print(current_fig is fig)
# 设置图形的大小
current_fig.set_size_inches(8, 6)
# 设置图形的标题
current_fig.suptitle('Example Plot')
# 显示图形
plt.show()
6.3.3、savefig
该函数用于将当前图形保存到文件中。该函数通常在完成图形绘制后调用,以便将图 形输出为图像文件,便于保存或分享。
matplotlib.pyplot.savefig(fname, dpi='figure', format=None, metadata=None, bbox_inches=None, pad_inches=0.1, facecolor='auto', edgecolor='auto', backend=None, **kwargs)
名称 | 描述 |
---|---|
fname | 文件的路径或文件对象, 用于保存图像。如果未指定 format 参数,Matplotlib 会根据文件扩展名推断图 像格式。 |
dpi | 图像的分辨率,以每英寸点数为单位。如果设置为 'figure',则使用当前图形的分辨率设置。 |
format | 图像的文件格式,例如 ‘png’, ‘pdf’, ‘svg’, ‘ps’, ‘eps’ 等。如 果未指定,则从 fname 的扩展名推断。 |
metadata | 要存储在图像文件中的元数据。 |
bbox_inches | 图像的边界框。如果设置为 ‘tight’,则 Matplotlib 会尝试紧凑地剪裁图像周围的空白。 |
pad_inches | 在边界框周围添加额外的空白(英寸)。 |
facecolor | 图形背景的颜色 |
edgecolor | 图形边缘的颜色 |
backend | 用于保存图像的特定后端。这通常不需要设置,除非你 想要覆盖默认的后端 |
kwargs | 其他关键字参数,将传递给底层后端的保存函数。 |
import matplotlib.pyplot as plt
# 创建一些数据
x = [0, 1, 2, 3, 4]
y = [0, 1, 4, 9, 16]
# 绘制图形
plt.plot(x, y)
# 保存图形到文件
plt.savefig('plot.png', dpi=200, bbox_inches='tight', facecolor='g')
# 显示图形(可选)
plt.show()
6.3.4、imshow
该函数可以用来显示二维数据数组,其中每个数组元素对应图像的一个像素。
matplotlib.pyplot.imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, **kwargs)
名称 | 描述 |
---|---|
X | 图像数据,通常是二维数组,但也可以是一维数组(在这种情况下,数据将 被解释为线图)。数据类型通常是浮点数或整数。 |
cmap | 颜色映射(colormap),用于指定图像中数值到颜色的映射。默认是 None,此时将使用默认的 colormap,通常是 viridis。 |
norm | 用于标准化数据值的归一化对象,可以确保颜色映射是线性的或者使用 其他映射方式 |
aspect | 控制图像的纵横比。 'auto' 保持宽高比, 'equal' 使每个像素都是 正方形,或者可以是一个数字。 |
interpolation | 指定图像缩放时的插值方法。常见的选项有 'nearest'(最近 邻插值)、 'bilinear'(双线性插值)、 'bicubic'(双三次插值)等。 |
alpha | 图像的透明度,取值范围是 [0, 1]。 |
vmin, vmax | 用于颜色映射的数据值范围。默认情况下,这些值是从数据中自 动推断出来的。 |
origin | 指定图像的原点, 'upper' 表示原点在左上角,‘lower' 表示原点在左下角 |
**kwargs | 其他关键字参数。 |
与plt.show的区别是:
1、imshow 是用于创建图像的函数,而 show 是用于显示图像的函数。
2、你可以在一个脚本中多次调用 imshow 来绘制多个图像,但通常只需要在脚本的 末尾调用一次 show 来显示所有图像。
import matplotlib.pyplot as plt
import numpy as np
# 创建两个简单的数据集
data1 = np.random.rand(10, 10)
data2 = np.random.rand(10, 10)
# 创建一个包含两个子图的图形
fig, (ax1, ax2) = plt.subplots(1, 2)
# 在第一个子图上显示第一个图像,并应用 viridis 颜色映射
ax1.imshow(data1, cmap='viridis', aspect='equal', origin='lower')
ax1.set_title('Image 1')
# 在第二个子图上显示第二个图像,并应用 plasma 颜色映射
ax2.imshow(data2, cmap='gray')
ax2.set_title('Image 2')
# 调整子图之间的间距
plt.tight_layout()
# 显示图像
plt.show()
6.3.5、close
该函数用于关闭一个或多个打开的图形窗口。在 Matplotlib 中,每次调用绘图命令 (如 plt.plot() 或 plt.imshow())时,都会创建一个新的图形(Figure)和一 个或多个子图(Axes)。 close 函数可以用来关闭这些图形窗口,释放资源,并允 许用户清理不再需要的图形。
matplotlib.pyplot.close(fig=None)
名称 | 描述 |
---|---|
fig | 指定要关闭的图形。如果是一个 Figure 对 象,则关闭该图形。如果是一个整数,则关闭与该编号对应的图形。如果省略或 为 None,则关闭当前图形。’all'表示关闭所有的图像。 |
import matplotlib.pyplot as plt
import time
# 创建并显示第一个图形
plt.figure()
plt.plot([1, 2, 3], [1, 2, 3])
plt.show(block=False)
# 创建并显示第二个图形
plt.figure()
plt.plot([3, 2, 1], [1, 2, 3])
plt.show(block=False)
# # 关闭当前图形
# plt.close(1)
# 创建第三个图形,但不显示
plt.figure()
plt.plot([1, 2, 3], [3, 2, 1])
plt.show(block=False)
time.sleep(2)
# 关闭所有图形
plt.close(fig='all')
time.sleep(2)
print(123)
6.3.6、pause
用于在动画或交互式绘图过程中暂停一段时间。这个函数在动画制作或者需要在绘图 之间插入延迟时非常有用。
matplotlib.pyplot.pause(interval)
名称 | 描述 |
---|---|
interval | 这个参数是一个浮点数,表示暂停的秒数。默认值通常是 0.1 秒。 |
主要作用:
1、暂停执行:当调用 plt.pause(interval) 时,Python 脚本会暂停执行指定的 时间(以秒为单位)。
2、更新显示:如果在绘图之前调用了 plt.pause,它将允许动态更新的图形(例如 动画)在屏幕上显示出来。这对于交互式绘图非常有用,因为它可以让用户看到 图形的更新。
import matplotlib.pyplot as plt
import numpy as np
# 创建一个图形和一个子图
fig, ax = plt.subplots()
# 生成一些数据
t = np.arange(0, 10, 0.01)
s = np.sin(t)
# 绘制第一条线
ax.plot(t, s)
# 显示图形
plt.show(block=False)
# 更新线的数据并暂停
for phase in np.arange(0, 2 * np.pi, 0.05):
ax.plot(t + phase, np.sin(t + phase))
plt.pause(0.01)
# 关闭图形
plt.close()
七、GridSpec
GridSpec提供了更灵活的方式来安排子图(subplot)的布局。在 Matplotlib 中,默 认的子图布局是通过 plt.subplot() 或 plt.subplots() 等函数实现的,但这些 函数都是按照行列均匀划分子图的,而GridSpec可以根据具体需求定制每个子图的 位置和大小。
该类处于 matplotlib.gridspec库下。
matplotlib.gridspec.GridSpec(nrows, ncols, figure=None, left=None, bottom=None, right=None, top=None, wspace=None, hspace=None, width_ratios=None, height_ratios=None)
名称 | 描述 |
---|---|
nrows | 网格的行数 |
ncols | 网格的列数 |
figure | 如果提供,GridSpec将与这个指定的 Figure 实例关联。如果没有提供, GridSpec 将与当前活动的 Figure 关联。 |
left, bottom, right,top | 这些参数用于指定网格在整个画布中的位 置,它们的值应该在 0 到 1 之间,表示画布宽度和高度的百分比。例如, left=0.1 表示网格左边界距离画布左边界 10% 的位置。 |
wspace | 子图之间的水平间距,这个值是以画布宽度的百分比来表示的。 |
hspace | 子图之间的垂直间距,这个值是以画布高度的百分比来表示的。 |
width_ratios | 可选,指定各列的相对宽度。默认情况下,所有列的宽度都是相 等的。如果提供这个参数,那么每一列的宽度将是其对应值的相对比例。 |
height_ratios | 可选,指定各行的相对高度。默认情况下,所有行的高度都是 相等的。如果提供这个参数,那么每一行的高度将是其对应值的相对比例。 |
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
fig = plt.figure(figsize=(8, 4))
# 创建一个 2 行 3 列的 GridSpec
gs = GridSpec(2, 3)
# 添加子图
ax1 = fig.add_subplot(gs[0, 0])
ax2 = fig.add_subplot(gs[0, 1])
ax3 = fig.add_subplot(gs[0, 2])
# ax4 = fig.add_subplot(gs[1, 0])
ax5 = fig.add_subplot(gs[1, :])
# 注意:gs[1, 1:] 表示第二行的第二列和第三列
plt.show()