在数据分析、科学计算以及机器学习项目中,数据可视化(Data Visualization)是一项重要环节。通过图形化方式展示数据,可以帮助我们理解数据分布、发现规律以及验证分析结果。
例如,在一组数据中:
如果只以数字形式呈现,很难直观理解变化趋势;但若绘制为折线图,数据变化便可以一目了然。
Matplotlib 是 Python 中最基础、最常用的可视化库之一,具有以下特点:
• 支持多种图形类型(折线图、散点图、柱状图、直方图等)
• 与 NumPy、Pandas 等科学计算库高度兼容
• 支持高度自定义的图形样式
• 提供面向函数(pyplot)与面向对象(Figure/Axes)两种绘图方式
• 可以导出多种格式图像(PNG、PDF、SVG 等)
安装 Matplotlib:
导入库:
import matplotlib.pyplot as plt
在 Matplotlib 中,大多数绘图函数都通过 matplotlib.pyplot 模块调用。
pyplot 提供了类似 MATLAB 的状态式绘图接口,本质上是对 Figure 与 Axes 对象操作的封装。
一、Matplotlib 的图形结构
理解 Matplotlib 的核心结构,有助于更清晰地理解各种绘图函数的作用。
Matplotlib 的图形系统由三个主要层次组成:
Figure → Axes → Artist
这三个层次可以理解为:
Figure 表示整个图形对象,是所有图形元素的顶层容器。
Axes 表示一个绘图坐标系区域,绝大多数绘图操作都发生在 Axes 上。
Artist 是图形中的具体元素,例如线条、文本、坐标轴和图例。
从视觉上可以理解为:
Figure(整个图形对象) ├── Axes(一个坐标系) │ ├── Line │ ├── Text │ └── Axis └── Axes(另一个子图)
在日常语言中,人们有时把 Figure 称为“画布”,而 Axes 则是画布上的绘图区。
在代码中通常通过 subplots() 同时创建 Figure 与 Axes:
此时:
• fig 表示整个图形对象
• ax 表示绘图坐标系
后续绘图操作通常发生在 ax 上:
这种方式称为“面向对象绘图方式”,也是 Matplotlib 官方推荐的使用方式。
二、基础绘图函数
Matplotlib 的核心功能是绘制各种统计图形,例如折线图、散点图、柱状图和直方图等。
plot()
用于绘制折线图(Line Plot),是 Matplotlib 中最常用的函数。
plt.plot( x, y, label=None, color=None, linestyle="-", linewidth=None, marker=None, markersize=None, alpha=None)
参数说明:
• x:横轴数据,通常为列表或 NumPy 数组。如果省略 x,则 Matplotlib 会自动生成从 0 开始的序列
• y:纵轴数据
• label:图例名称
• color:线条颜色
• linestyle:线条线型,例如 "-"、"--"、":"
• linewidth:线宽
• marker:数据点标记,例如 'o'、's'、'^'
• markersize:标记大小
• alpha:图形元素透明度
返回值:
返回一个 Line2D 对象列表。
示例:
import matplotlib.pyplot as pltimport numpy as npx = np.linspace(0, 10, 100)y = np.sin(x)plt.plot(x, y, marker="o", label="sin(x)")plt.legend()plt.show()
说明:
plot() 是 Matplotlib 中最基础的绘图函数,适用于:
• 时间序列分析
• 函数曲线绘制
• 数据趋势展示
以下示例默认已导入 Matplotlib 和 NumPy。
scatter()
用于绘制散点图(Scatter Plot)。
plt.scatter( x, y, s=None, c=None, marker=None, cmap=None, alpha=None)
参数说明:
• x:横轴数据
• y:纵轴数据
• s:散点大小(size)
• c:散点颜色(color)
• marker:散点形状
• cmap:颜色映射
• alpha:散点图形透明度
返回值:
返回 PathCollection 对象。
示例:
x = [1,2,3,4,5]y = [5,7,6,8,7]plt.scatter(x, y)plt.show()
说明:
散点图常用于观察两个变量之间的关系,例如回归分析、相关性分析等。
bar()
用于绘制柱状图(Bar Chart)。
plt.bar( x, height, width=0.8, color=None, align="center", alpha=None)
参数说明:
• x:柱子位置或类别标签
• height:柱子的高度
• width:柱子宽度
• color:柱子颜色
• align:对齐方式
• alpha:图形元素透明度
返回:
返回 BarContainer 对象。
示例:
categories = ["A", "B", "C", "D"]values = np.random.randint(10, 30, 4)plt.bar(categories, values)plt.show()
说明:
柱状图常用于比较不同类别的数据。
hist()
用于绘制直方图(Histogram)。
plt.hist( x, bins=10, range=None, density=False, color=None, alpha=None)
参数说明:
• x:输入数据序列
• bins:分箱数量
• range:统计范围
• density:指定是否归一化为概率密度
• color:指定颜色
• alpha:指定透明度
返回:
返回三个对象 (n, bins, patches):
n:每个区间的计数值bins:区间边界数组patches:绘制的矩形对象集合
示例:
data = np.random.normal(0, 1, 1000)plt.hist(data, bins=30)plt.show()
说明:
直方图常用于观察数据分布,例如判断数据是否接近正态分布。
pie()
用于绘制饼图(Pie Chart)。
plt.pie( x, labels=None, autopct=None, startangle=0)
参数说明:
• x:各部分的数据值
• labels:指定标签
• autopct:指定百分比显示格式,例如 "%1.1f%%"
• startangle:指定饼图起始角度
示例:
sizes = [30, 40, 30]labels = ["A", "B", "C"]plt.pie(sizes, labels=labels, autopct="%1.1f%%")plt.show()
说明:
饼图常用于展示各部分在整体中的比例关系。
三、图形结构函数
在 Matplotlib 中,可以通过多种方式创建图形对象与子图。
figure()
用于创建图形对象。
plt.figure(figsize=None, dpi=None)
参数说明:
• figsize:用于指定图形尺寸,单位为英寸
• dpi:图像分辨率
示例:
plt.figure(figsize=(6,4))x = np.linspace(0,5,100)plt.plot(x, x**2)plt.show()
subplot()
用于创建子图。
plt.subplot(nrows, ncols, index)
参数说明:
• nrows:子图行数
• ncols :子图列数
• index:当前子图编号
示例:
x = np.linspace(0,10,100)plt.subplot(1,2,1)plt.plot(x, np.sin(x))plt.subplot(1,2,2)plt.plot(x, np.cos(x))plt.show()
subplots()
用于同时创建 Figure 与 Axes。
fig, ax = plt.subplots(nrows=1, ncols=1)
示例:
x = np.linspace(0,10,100)fig, ax = plt.subplots()ax.plot(x, np.sin(x))plt.show()
这种方式是 Matplotlib 官方推荐的绘图方式。
四、图形元素函数
绘制图形后,通常需要添加标题、标签、图例等元素。
title()
设置图标题。
plt.title(label, fontsize=None, loc=None)
参数说明:
• label:标题内容
• fontsize:指定字体大小
• loc:指定标题位置
xlabel() / ylabel()
设置坐标轴标签。
plt.xlabel(label)plt.ylabel(label)
legend()
显示图例。
示例:
x = np.arange(5)plt.plot(x, x, label="A")plt.plot(x, x**2, label="B")plt.legend()plt.show()
grid()
显示网格。
网格可以帮助读者更容易估计数据位置。
tight_layout()
自动调整子图间距,避免标签或标题重叠。
五、图像输出函数
savefig()
用于将图形保存为文件。
plt.savefig( fname, dpi=None, bbox_inches=None, transparent=False)
参数说明:
• fname:文件名
• dpi:图像分辨率
• bbox_inches:指定是否自动裁剪空白区域
• transparent:指定背景是否透明
示例:
plt.plot(np.arange(5), np.arange(5)**2)plt.savefig("plot.png", dpi=300, bbox_inches="tight")plt.show()
上述代码会先将图形保存为文件,再显示图形窗口。
Matplotlib 支持导出多种图像格式,例如 PNG、PDF、SVG 和 JPG。
show()
用于显示图形窗口。
在普通 Python 脚本中通常需要调用 show() 才能显示图形窗口。
在 Jupyter Notebook 中,图形通常会自动显示。
六、简单数据可视化示例
在数据分析项目中,Matplotlib 常用于展示数据趋势、分布以及变量关系。
例如:
import matplotlib.pyplot as pltimport numpy as np# 生成示例数据x = np.arange(0, 10)y = x ** 2# 绘制折线图plt.plot(x, y, marker="o", label="y = x^2")# 设置标题和标签plt.title("Example Function")plt.xlabel("x")plt.ylabel("y")# 显示图例与网格plt.legend()plt.grid(True)# 显示图形plt.show()
运行结果将得到一个函数曲线图。
这种图形在以下场景中非常常见:
• 数学函数可视化
• 机器学习训练曲线
• 时间序列趋势分析
• 实验数据展示
七、Matplotlib 后端控制与全局配置
Matplotlib 的图形系统不仅涉及绘图函数,还依赖于运行环境配置,这些配置通常在程序开始阶段进行设置。
1、后端控制
matplotlib.use()
Matplotlib 的图形显示依赖于图形后端(backend)。后端负责图形渲染、窗口显示以及图像输出。
参数说明:
• backend:后端名称字符串,例如:
"TkAgg":使用 Tk 图形界面"QtAgg":使用 Qt 图形界面"Agg":不显示图形窗口,仅用于生成图像文件
示例:
import matplotlibmatplotlib.use("Agg")import matplotlib.pyplot as plt
说明:
• Agg 后端通常用于:
• 服务器环境
• 批量生成图像
• 无图形界面的系统
需要注意的是,matplotlib.use() 必须在导入 pyplot 之前调用,否则设置不会生效。
2、全局配置
plt.rcParams
rcParams 是 Matplotlib 的全局配置参数系统。它本质上是一个字典对象,用于控制图形的默认行为。
plt.rcParams[key] = value
其中,常见的配置项名称 key 有:
plt.rcParams["font.sans-serif"] = ["SimHei"] # 用于指定无衬线字体列表plt.rcParams["axes.unicode_minus"] = False # 用于控制坐标轴中负号的显示方式plt.rcParams["figure.figsize"] = (6,4) # 用于设置默认图形尺寸plt.rcParams["figure.dpi"] = 120 # 用于设置图像默认分辨率plt.rcParams["lines.linewidth"] = 2 # 用于设置线条默认宽度plt.rcParams["grid.linestyle"] = "--" # 用于设置网格线样式plt.rcParams["axes.titlesize"] = 14 # 用于设置图标题字体大小plt.rcParams["axes.labelsize"] = 12 # 用于设置坐标轴标签字体大小
Matplotlib 的所有配置项都存储在 rcParams 字典中,可以通过以下方式查看:
如果希望查看某一个参数的当前值,可以使用:
plt.rcParams["figure.figsize"]
在 Matplotlib 中,默认字体通常不包含中文字符,因此绘制包含中文的图形时可能出现乱码。
解决方法是通过 rcParams 指定中文字体。
示例:
import matplotlib.pyplot as pltplt.rcParams["font.sans-serif"] = ["SimHei"] plt.rcParams["axes.unicode_minus"] = False
说明:
• font.sans-serif 用于指定无衬线字体列表。SimHei 是常见的中文字体(黑体)
• axes.unicode_minus 用于控制负号显示。如果设为 False,则使用普通字符 "-" 代替 Unicode 负号,以避免字体缺失导致的显示问题。
3、图形样式系统
plt.style.use()
除了通过 rcParams 设置单个参数外,Matplotlib 还提供了图形样式系统(style system),用于一次性应用整套图形风格。
plt.style.use(style_name)
参数说明:
• style_name 表示样式名称字符串,用于指定预设的图形风格。Matplotlib 内置了多种样式,例如:
"ggplot""seaborn-v0_8""bmh""classic""dark_background"
这些样式通常模仿常见统计软件或可视化工具的绘图风格。
示例:
import numpy as npimport matplotlib.pyplot as pltplt.style.use("ggplot")x = np.linspace(0, 10, 100)y = np.sin(x)plt.plot(x, y)plt.title("Example Plot")plt.show()
运行后可以看到图形使用了类似 R 语言 ggplot2 的绘图风格。
plt.style.available
用于查看所有可用样式。
不同版本的 Matplotlib 中,可用样式名称可能略有不同。
📘 小结
Matplotlib 是 Python 中最基础的数据可视化库,提供了折线图、散点图、柱状图、直方图等常见图形绘制功能。通过 plot()、scatter()、bar()、hist() 等常用函数,并结合 title()、legend()、grid() 等图形元素设置,可以较方便地构建数据分析与机器学习中的可视化展示流程。