【深度学习-Day 8】让数据说话:Python 可视化双雄 Matplotlib 与 Seaborn 教程
Langchain系列文章目录
01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南
02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖
03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南
04-玩转 LangChain:从文档加载到高效问答系统构建的全程实战
05-玩转 LangChain:深度评估问答系统的三种高效方法(示例生成、手动评估与LLM辅助评估)
06-从 0 到 1 掌握 LangChain Agents:自定义工具 + LLM 打造智能工作流!
07-【深度解析】从GPT-1到GPT-4:ChatGPT背后的核心原理全揭秘
08-【万字长文】MCP深度解析:打通AI与世界的“USB-C”,模型上下文协议原理、实践与未来
Python系列文章目录
PyTorch系列文章目录
机器学习系列文章目录
深度学习系列文章目录
Java系列文章目录
JavaScript系列文章目录
深度学习系列文章目录
01-【深度学习-Day 1】为什么深度学习是未来?一探究竟AI、ML、DL关系与应用
02-【深度学习-Day 2】图解线性代数:从标量到张量,理解深度学习的数据表示与运算
03-【深度学习-Day 3】搞懂微积分关键:导数、偏导数、链式法则与梯度详解
04-【深度学习-Day 4】掌握深度学习的“概率”视角:基础概念与应用解析
05-【深度学习-Day 5】Python 快速入门:深度学习的“瑞士军刀”实战指南
06-【深度学习-Day 6】掌握 NumPy:ndarray 创建、索引、运算与性能优化指南
07-【深度学习-Day 7】精通Pandas:从Series、DataFrame入门到数据清洗实战
08-【深度学习-Day 8】让数据说话:Python 可视化双雄 Matplotlib 与 Seaborn 教程
文章目录
- Langchain系列文章目录
- Python系列文章目录
- PyTorch系列文章目录
- 机器学习系列文章目录
- 深度学习系列文章目录
- Java系列文章目录
- JavaScript系列文章目录
- 深度学习系列文章目录
- 前言
- 一、为什么需要数据可视化?
- 1.1 直观理解数据
- 1.2 发现模式与趋势
- 1.3 清晰传达结果
- 二、Matplotlib:Python 可视化的基石
- 2.1 Matplotlib 简介
- 2.1.1 什么是 Matplotlib?
- 2.1.2 安装 Matplotlib
- 2.2 Matplotlib 核心概念
- 2.2.1 Figure 与 Axes
- 2.2.2 Pyplot 接口
- 2.3 绘制基本图形
- 2.3.1 折线图 (Line Plot)
- (1)应用场景
- (2)代码示例
- 2.3.2 散点图 (Scatter Plot)
- (1)应用场景
- (2)代码示例
- 2.3.3 柱状图 (Bar Plot)
- (1)应用场景
- (2)代码示例
- 2.4 图像定制化
- 2.4.1 添加标题和标签
- 2.4.2 修改颜色、线型和标记
- 2.4.3 添加图例
- 2.4.4 代码示例:综合定制
- 三、Seaborn:让可视化更美观
- 3.1 Seaborn 简介
- 3.1.1 什么是 Seaborn?
- 3.1.2 Seaborn 与 Matplotlib 的关系
- 3.1.3 安装 Seaborn
- 3.2 使用 Seaborn 增强可视化
- 3.2.1 风格设置
- 3.2.2 常用绘图函数
- (1)关系图 (Relational Plots)
- (2)分类图 (Categorical Plots)
- (3)分布图 (Distribution Plots)
- (4)热力图 (Heatmaps)
- 3.2.3 代码示例:使用 Seaborn 绘制美观图形
- 四、实战:可视化 NumPy 与 Pandas 数据
- 4.1 使用 Matplotlib 可视化 NumPy 数组
- 4.1.1 场景描述
- 4.1.2 代码示例
- 4.2 使用 Seaborn 可视化 Pandas DataFrame
- 4.2.1 场景描述
- 4.2.2 代码示例
- 五、常见问题与选择建议
- 5.1 Matplotlib vs Seaborn:何时选择哪个?
- 5.2 图像不显示或中文乱码问题
- (1)图像不显示
- (2)中文乱码问题
- 六、总结
前言
在深度学习的征途中,我们不仅需要与冰冷的数字和复杂的算法打交道,更需要一种直观的方式来理解数据、洞察模型行为并有效地展示研究成果。“一图胜千言”,数据可视化正是连接数据与洞察的桥梁。它能够帮助我们发现隐藏在数据背后的模式、趋势和异常点,从而更好地指导我们的数据分析和模型调优工作。
在 Python 的生态系统中,Matplotlib 和 Seaborn 是两个功能强大且广受欢迎的数据可视化库。Matplotlib 提供了灵活的底层绘图接口,几乎可以绘制任何类型的静态、动态、交互式图表。而 Seaborn 则构建于 Matplotlib 之上,提供了更高级别的接口,使得创建美观且信息丰富的统计图形变得更加容易。
本篇文章作为深度学习基础准备阶段的第八篇,将带领大家系统学习如何使用 Matplotlib 和 Seaborn 这两大神器,让您的数据和模型结果“说话”,为后续的深度学习实践打下坚实的视觉分析基础。
一、为什么需要数据可视化?
在深入学习具体的绘图库之前,我们首先需要理解数据可视化为什么如此重要。简单来说,数据可视化主要有以下三个方面的核心价值:
1.1 直观理解数据
人类大脑对视觉信息的处理远胜于对抽象数字的处理。通过将数据转换成图形,我们可以更快速、更直观地把握数据的分布、集中趋势、离散程度等关键特征。例如,一组看似杂乱无章的销售数据,通过折线图可以清晰地展示其随时间的变化趋势。
1.2 发现模式与趋势
数据可视化是探索性数据分析(EDA)的关键环节。通过绘制不同类型的图表,我们可以更容易地发现数据中隐藏的模式、相关性、聚类以及异常值。这些发现对于特征工程、模型选择和问题诊断至关重要。例如,通过散点图矩阵,我们可以快速识别不同特征之间的线性或非线性关系。
1.3 清晰传达结果
无论是学术研究、商业报告还是项目演示,清晰、有效地传达分析结果都至关重要。精美的图表不仅能让观众更容易理解复杂的分析结果,还能增强报告的说服力和专业性。一个精心设计的可视化作品,其传递信息的效率远高于冗长的文字描述。
二、Matplotlib:Python 可视化的基石
Matplotlib 是 Python 中应用最广泛的绘图库,它几乎是所有其他 Python 可视化库(包括 Seaborn)的基础。学习 Matplotlib 能让我们掌握最底层的绘图逻辑,从而实现高度定制化的可视化需求。
2.1 Matplotlib 简介
2.1.1 什么是 Matplotlib?
Matplotlib 是一个用于创建高质量静态、动态和交互式可视化的 Python 库。它提供了一个类似 MATLAB 的绘图框架,使得用户可以轻松生成各种类型的图表,如折线图、散点图、柱状图、直方图、饼图等。Matplotlib 的设计理念是尽可能地让简单的事情简单化,让复杂的事情成为可能。
2.1.2 安装 Matplotlib
在开始使用 Matplotlib 之前,我们需要先安装它。如果您使用的是 Anaconda 或 Miniconda,可以通过以下命令在终端或 Anaconda Prompt 中安装:
conda install matplotlib
如果您使用的是 pip,则可以使用以下命令:
pip install matplotlib
安装完成后,我们就可以在 Python 脚本或 Jupyter Notebook 中导入并使用它了。
import matplotlib.pyplot as plt
import numpy as np # 通常与 NumPy 结合使用
2.2 Matplotlib 核心概念
理解 Matplotlib 的核心组件是高效使用它的关键。
2.2.1 Figure 与 Axes
在 Matplotlib 中,最顶层的容器是 Figure
,可以将其理解为一个画布,所有的绘图元素都将放置在这个画布上。一个 Figure
对象可以包含一个或多个 Axes
对象。
Axes
(轴域)才是真正进行绘图的区域,它代表了图表中的一个子图。一个 Axes
对象通常包含两个(或三个,对于3D图)Axis
对象(坐标轴),用于定义数据的范围和刻度。我们可以在一个 Figure
上创建多个 Axes
,从而实现多子图的布局。
2.2.2 Pyplot 接口
matplotlib.pyplot
是 Matplotlib 的一个模块,它提供了一个类似 MATLAB 的命令式函数集合,用于快速、便捷地创建图表。通常,我们将其导入为 plt
。pyplot
模块会自动管理当前的 Figure
和 Axes
对象,使得我们可以直接调用绘图函数而无需显式地创建它们。
2.3 绘制基本图形
接下来,我们将学习如何使用 pyplot
接口绘制几种常见的图形。
2.3.1 折线图 (Line Plot)
折线图通常用于显示数据随某个连续变量(如时间)变化的趋势。
(1)应用场景
- 展示股票价格随时间的变化。
- 显示实验测量值随参数的变化。
- 可视化模型训练过程中的损失值或准确率变化。
(2)代码示例
import matplotlib.pyplot as plt
import numpy as np# 准备数据
x = np.linspace(0, 10, 100) # 生成0到10之间的100个点
y1 = np.sin(x)
y2 = np.cos(x)# 创建一个Figure和一个Axes
fig, ax = plt.subplots()# 绘制折线图
ax.plot(x, y1, label='sin(x)') # 绘制 y1
ax.plot(x, y2, label='cos(x)') # 绘制 y2# 添加标题和标签
ax.set_title('简单折线图示例')
ax.set_xlabel('X 轴')
ax.set_ylabel('Y 轴')# 添加图例
ax.legend()# 显示图形
plt.show()
代码解释:
np.linspace(0, 10, 100)
: 创建一个包含100个从0到10等间隔的数值的NumPy数组。plt.subplots()
: 创建一个 Figure 对象和一个 Axes 对象。这是推荐的绘图方式,可以更好地控制图形的各个部分。ax.plot(x, y1, label='sin(x)')
: 在ax
(Axes对象) 上绘制折线图。label
参数用于后续生成图例。ax.set_title()
,ax.set_xlabel()
,ax.set_ylabel()
: 设置图形的标题和坐标轴标签。ax.legend()
: 显示图例,它会根据plot
函数中的label
参数自动生成。plt.show()
: 显示绘制好的图形。
2.3.2 散点图 (Scatter Plot)
散点图用于展示两个变量之间的关系,每个点代表一个数据样本。
(1)应用场景
- 观察两个特征之间的相关性。
- 识别数据中的聚类或异常点。
- 比较不同组别的数据分布。
(2)代码示例
import matplotlib.pyplot as plt
import numpy as np# 准备数据
np.random.seed(0) # 设置随机种子以保证结果可复现
x = np.random.rand(50) # 50个0到1之间的随机数
y = 2 * x + 1 + np.random.randn(50) * 0.3 # y = 2x + 1 + 噪声
colors = np.random.rand(50) # 为每个点生成随机颜色
sizes = 100 * np.random.rand(50) # 为每个点生成随机大小# 创建一个Figure和一个Axes
fig, ax = plt.subplots()# 绘制散点图
scatter = ax.scatter(x, y, c=colors, s=sizes, alpha=0.7, cmap='viridis') # c=颜色, s=大小, alpha=透明度, cmap=颜色映射# 添加标题和标签
ax.set_title('散点图示例')
ax.set_xlabel('X 值')
ax.set_ylabel('Y 值')# 添加颜色条 (colorbar)
fig.colorbar(scatter, label='颜色值')# 显示图形
plt.show()
代码解释:
np.random.seed(0)
: 确保每次运行代码时生成的随机数都是一样的,便于复现。ax.scatter()
: 绘制散点图。c=colors
: 指定每个点的颜色。s=sizes
: 指定每个点的大小。alpha=0.7
: 设置点的透明度,当点重叠时很有用。cmap='viridis'
: 指定颜色映射方案,将colors
数组中的数值映射到具体的颜色。
fig.colorbar(scatter, label='颜色值')
: 为散点图添加一个颜色条,用于解释颜色与数值的对应关系。
2.3.3 柱状图 (Bar Plot)
柱状图用于比较不同类别的数据大小。
(1)应用场景
- 比较不同产品的销量。
- 展示不同城市的人口数量。
- 可视化分类特征的频数分布。
(2)代码示例
import matplotlib.pyplot as plt# 准备数据
categories = ['类别 A', '类别 B', '类别 C', '类别 D']
values = [25, 40, 30, 50]# 创建一个Figure和一个Axes
fig, ax = plt.subplots()# 绘制柱状图
bars = ax.bar(categories, values, color=['skyblue', 'lightcoral', 'lightgreen', 'gold'])# 添加标题和标签
ax.set_title('柱状图示例')
ax.set_xlabel('类别')
ax.set_ylabel('数量')# 在每个柱子上方显示数值
for bar in bars:yval = bar.get_height()plt.text(bar.get_x() + bar.get_width()/2.0, yval + 1, round(yval, 1), ha='center', va='bottom')# 显示图形
plt.show()
代码解释:
ax.bar(categories, values, color=...)
: 绘制柱状图。color
参数可以是一个颜色列表,为每个柱子指定不同的颜色。- 循环部分 (
for bar in bars: ...
): 用于在每个柱子的顶部显示其对应的数值,增强可读性。bar.get_height()
: 获取柱子的高度。bar.get_x()
: 获取柱子左下角的 x 坐标。bar.get_width()
: 获取柱子的宽度。plt.text()
: 在指定位置添加文本。
2.4 图像定制化
Matplotlib 提供了丰富的选项来定制图形的各个方面,使其更具表现力和美观性。
2.4.1 添加标题和标签
如前面的示例所示,可以使用 ax.set_title()
, ax.set_xlabel()
, ax.set_ylabel()
来为图形和坐标轴添加标题和标签。还可以通过 fontsize
参数调整字体大小。
ax.set_title('定制化标题', fontsize=16)
ax.set_xlabel('X 轴标签', fontsize=12)
ax.set_ylabel('Y 轴标签', fontsize=12)
2.4.2 修改颜色、线型和标记
在 plot
函数中,可以通过参数控制线条的颜色 (color)、线型 (linestyle) 和数据点的标记 (marker)。
- 颜色 (color): 可以使用预定义的颜色名称(如 ‘red’, ‘blue’, ‘green’)、十六进制颜色码(如 ‘#FF5733’)或 RGB 元组。
- 线型 (linestyle): 常用的有 ‘-’ (实线), ‘–’ (虚线), ‘:’ (点线), ‘-.’ (点划线)。
- 标记 (marker): 用于标记数据点,如 ‘o’ (圆圈), ‘.’ (点), ‘,’ (像素), ‘s’ (正方形), ‘^’ (上三角)。
2.4.3 添加图例
当一个图形中包含多条线或多个数据集时,图例 (legend) 就非常重要。通过在绘图函数中设置 label
参数,然后调用 ax.legend()
即可显示图例。
ax.legend(loc='upper right', fontsize=10) # loc 参数可以控制图例的位置
2.4.4 代码示例:综合定制
import matplotlib.pyplot as plt
import numpy as npx = np.linspace(0, 2 * np.pi, 50)
y_sin = np.sin(x)
y_cos = np.cos(x)fig, ax = plt.subplots(figsize=(8, 6)) # figsize 控制画布大小ax.plot(x, y_sin,color='purple', # 线条颜色linestyle='--', # 线型为虚线linewidth=2, # 线条宽度marker='o', # 数据点标记为圆圈markersize=5, # 标记大小markerfacecolor='yellow', # 标记填充颜色markeredgecolor='red', # 标记边缘颜色label='Sin Wave')ax.plot(x, y_cos,color='#2E8B57', # SeaGreen 的十六进制码linestyle=':', # 线型为点线linewidth=2,marker='s',markersize=5,label='Cos Wave')ax.set_title('定制化折线图', fontsize=18, fontweight='bold') # fontweight 设置字体粗细
ax.set_xlabel('弧度 (Radians)', fontsize=14)
ax.set_ylabel('函数值', fontsize=14)ax.grid(True, linestyle=':', alpha=0.7) # 添加网格线
ax.legend(loc='lower left', fontsize=12, shadow=True, frameon=True, facecolor='lightgray') # 更丰富的图例设置# 设置坐标轴范围
ax.set_xlim(0, 2 * np.pi)
ax.set_ylim(-1.5, 1.5)# 设置刻度
ax.set_xticks(np.linspace(0, 2 * np.pi, 5)) # 设置 X 轴刻度点
ax.set_xticklabels(['0', 'π/2', 'π', '3π/2', '2π']) # 设置 X 轴刻度标签plt.tight_layout() # 自动调整子图参数,使之填充整个图像区域
plt.show()
代码解释:
figsize=(8, 6)
: 在创建 Figure 时指定其宽度和高度(单位为英寸)。linewidth
: 控制线条的宽度。markerfacecolor
,markeredgecolor
: 分别设置数据点标记的填充颜色和边缘颜色。ax.grid(True, ...)
: 添加网格线,linestyle
和alpha
可以分别设置网格线的样式和透明度。ax.legend(...)
: 提供了更多图例定制选项,如shadow
(阴影),frameon
(边框),facecolor
(背景色)。ax.set_xlim()
,ax.set_ylim()
: 设置 X 轴和 Y 轴的显示范围。ax.set_xticks()
,ax.set_xticklabels()
: 自定义坐标轴的刻度位置和标签。plt.tight_layout()
: 自动调整布局,防止标签重叠或超出边界。
三、Seaborn:让可视化更美观
虽然 Matplotlib 功能强大且灵活,但有时为了创建具有统计意义且美观的图形,需要编写较多的样板代码。Seaborn 的出现正是为了简化这一过程,它提供了更高级别的接口,专注于统计可视化。
3.1 Seaborn 简介
3.1.1 什么是 Seaborn?
Seaborn 是一个基于 Matplotlib 的 Python 数据可视化库。它提供了一个高级界面,用于绘制引人入胜且信息丰富的统计图形。Seaborn 的目标是使可视化成为数据探索和理解的核心部分。
3.1.2 Seaborn 与 Matplotlib 的关系
Seaborn 是建立在 Matplotlib 之上的。这意味着 Seaborn 使用 Matplotlib 来实际渲染图形。因此,您通常可以将 Matplotlib 的定制命令与 Seaborn 图形结合使用。可以理解为 Seaborn 是 Matplotlib 的一个更高级、更专注统计的封装。
3.1.3 安装 Seaborn
与 Matplotlib 类似,可以使用 conda 或 pip 安装 Seaborn:
conda install seaborn
或者:
pip install seaborn
通常,我们会将 Seaborn 导入为 sns
:
import seaborn as sns
import matplotlib.pyplot as plt # 通常也需要导入 Matplotlib 进行微调
3.2 使用 Seaborn 增强可视化
Seaborn 的强大之处在于其内置的统计功能和美观的默认样式。
3.2.1 风格设置
Seaborn 提供了多种内置的主题和颜色方案,可以轻松改变图形的整体外观。
sns.set_theme(style="darkgrid") # 设置主题,可选:"whitegrid", "dark", "white", "ticks"
# sns.set_style("whitegrid") # 另一种设置风格的方式
# sns.set_palette("pastel") # 设置调色板
只需在绘图代码之前调用这些函数,后续的 Seaborn (甚至 Matplotlib) 图形都会应用这些风格。
3.2.2 常用绘图函数
Seaborn 提供了许多专门用于统计分析的绘图函数,通常它们能够更好地处理 Pandas DataFrame。
(1)关系图 (Relational Plots)
用于可视化两个变量之间的关系。
sns.relplot()
: Figure-level 接口,可以创建散点图 (kind="scatter"
, 默认) 或线图 (kind="line"
)。sns.scatterplot()
: Axes-level 散点图。sns.lineplot()
: Axes-level 折线图,可以自动计算聚合统计量(如均值和置信区间)。
(2)分类图 (Categorical Plots)
用于可视化一个数值变量与一个或多个分类变量之间的关系。
sns.catplot()
: Figure-level 接口,支持多种分类图,如:- 散点图:
kind="strip"
(默认),kind="swarm"
- 分布图:
kind="box"
,kind="violin"
,kind="boxen"
- 估计图:
kind="point"
,kind="bar"
,kind="count"
- 散点图:
- Axes-level 函数如
sns.boxplot()
,sns.violinplot()
,sns.barplot()
,sns.countplot()
,sns.stripplot()
,sns.swarmplot()
。
(3)分布图 (Distribution Plots)
用于可视化单个变量的分布或多个变量的联合分布。
sns.displot()
: Figure-level 接口,可以绘制直方图 (kind="hist"
, 默认)、核密度估计图 (kind="kde"
)、经验累积分布函数图 (kind="ecdf"
)。sns.histplot()
: Axes-level 直方图。sns.kdeplot()
: Axes-level 核密度估计图。sns.ecdfplot()
: Axes-level ECDF图。sns.rugplot()
: 在轴上绘制小标记表示数据点。sns.jointplot()
: 绘制两个变量的联合分布和各自的边缘分布。sns.pairplot()
: 绘制数据集中两两特征间的关系图(散点图或直方图)。
(4)热力图 (Heatmaps)
用于将矩阵数据显示为颜色编码的图像。
sns.heatmap()
: 非常适合可视化相关性矩阵、混淆矩阵等。
3.2.3 代码示例:使用 Seaborn 绘制美观图形
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np# 设置 Seaborn 风格
sns.set_theme(style="whitegrid")# 1. 使用 Seaborn 绘制折线图 (自动处理置信区间)
fmri = sns.load_dataset("fmri") # 加载 Seaborn 内置数据集
plt.figure(figsize=(8, 5)) # Matplotlib 的 figure 设置仍然适用
sns.lineplot(x="timepoint", y="signal", hue="event", style="region", data=fmri)
plt.title('Seaborn 折线图 (fMRI 数据)', fontsize=15)
plt.show()# 2. 使用 Seaborn 绘制散点图,并按类别着色
iris = sns.load_dataset("iris") # 加载鸢尾花数据集
plt.figure(figsize=(8, 5))
sns.scatterplot(x="sepal_length", y="sepal_width", hue="species", size="petal_length", data=iris, palette="viridis", alpha=0.8)
plt.title('Seaborn 散点图 (Iris 数据集)', fontsize=15)
plt.show()# 3. 使用 Seaborn 绘制箱线图 (Box Plot)
tips = sns.load_dataset("tips") # 加载小费数据集
plt.figure(figsize=(8, 5))
sns.boxplot(x="day", y="total_bill", hue="smoker", data=tips, palette="Set2")
plt.title('Seaborn 箱线图 (Tips 数据集)', fontsize=15)
plt.show()# 4. 使用 Seaborn 绘制热力图 (Heatmap)
# 创建一个随机的相关性矩阵数据
np.random.seed(42)
data = pd.DataFrame(np.random.rand(10, 10), columns=[f'Var{i}' for i in range(1, 11)])
correlation_matrix = data.corr()
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap="coolwarm", fmt=".2f", linewidths=.5)
# annot=True: 在单元格中显示数值
# cmap="coolwarm": 设置颜色映射
# fmt=".2f": 设置数值格式(保留两位小数)
# linewidths=.5: 设置单元格之间的线条宽度
plt.title('Seaborn 热力图 (相关性矩阵)', fontsize=15)
plt.show()
代码解释:
sns.load_dataset()
: Seaborn 提供了一些内置的数据集,方便学习和测试。hue
: Seaborn 的一个强大参数,可以根据指定的列对数据进行分组,并用不同的颜色、标记或线型来区分。style
: 类似于hue
,但用不同的标记或线型区分。palette
: 控制颜色方案。sns.boxplot()
: 直观地展示了不同类别下数据的分布情况,包括中位数、四分位数和异常值。sns.heatmap()
: 将数值矩阵可视化为颜色编码的图,常用于展示相关性矩阵。annot=True
可以在每个单元格中显示数值。
四、实战:可视化 NumPy 与 Pandas 数据
在实际的数据分析和机器学习项目中,我们通常会使用 NumPy 存储数值数组,使用 Pandas 存储和处理表格数据 (DataFrame)。Matplotlib 和 Seaborn 都能很好地与这两个库集成。
4.1 使用 Matplotlib 可视化 NumPy 数组
4.1.1 场景描述
假设我们有一些通过 NumPy 生成或处理的实验数据,例如某个物理量随时间变化的测量值,我们希望将其可视化。
4.1.2 代码示例
import matplotlib.pyplot as plt
import numpy as np# 生成模拟数据
time = np.arange(0, 10, 0.1) # 时间序列,从0到10,步长0.1
signal_A = np.exp(-time / 3.0) * np.sin(2 * np.pi * time) # 信号A:衰减正弦波
noise = np.random.normal(0, 0.1, len(time)) # 高斯噪声
signal_B = signal_A + noise # 信号B:带噪声的信号A# 使用 Matplotlib 绘图
fig, ax = plt.subplots(figsize=(10, 6))ax.plot(time, signal_A, label='原始信号 (Signal A)', color='blue', linestyle='-', linewidth=2)
ax.plot(time, signal_B, label='带噪声信号 (Signal B)', color='red', linestyle=':', linewidth=1.5, alpha=0.7)
# ax.scatter(time[::5], signal_B[::5], label='部分采样点', color='green', marker='x') # 每隔5个点绘制一个标记ax.set_title('NumPy 数组可视化:信号与噪声', fontsize=16)
ax.set_xlabel('时间 (s)', fontsize=14)
ax.set_ylabel('信号幅值', fontsize=14)
ax.legend(fontsize=12)
ax.grid(True, linestyle='--', alpha=0.6)plt.show()
这个例子展示了如何直接将 NumPy 数组传递给 Matplotlib 的 plot
函数进行绘图,并进行相应的定制。
4.2 使用 Seaborn 可视化 Pandas DataFrame
4.2.1 场景描述
Pandas DataFrame 是处理结构化数据的标准方式。Seaborn 在设计上就非常适合直接操作 DataFrame,可以方便地根据列名来指定绘图的变量。
4.2.2 代码示例
假设我们有一个包含学生考试成绩的 Pandas DataFrame,我们想分析不同科目成绩的分布以及它们之间的关系。
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np# 生成模拟学生成绩数据
np.random.seed(123)
data = {'学生ID': range(1, 101),'数学成绩': np.random.randint(50, 100, 100),'英语成绩': np.random.randint(40, 95, 100),'科学成绩': np.random.randint(60, 100, 100),'班级': np.random.choice(['A班', 'B班', 'C班'], 100, p=[0.3, 0.4, 0.3])
}
df_scores = pd.DataFrame(data)# 1. 查看各科目成绩的分布 (直方图与核密度估计)
plt.figure(figsize=(12, 6))
sns.histplot(data=df_scores, x='数学成绩', hue='班级', kde=True, multiple="stack")
# multiple="stack" 可以将不同班级的直方图堆叠起来
plt.title('数学成绩分布 (按班级)', fontsize=15)
plt.show()# 2. 查看数学成绩与英语成绩之间的关系 (散点图,按班级区分)
plt.figure(figsize=(8, 6))
sns.scatterplot(data=df_scores, x='数学成绩', y='英语成绩', hue='班级', style='班级', s=80)
plt.title('数学成绩 vs 英语成绩 (按班级)', fontsize=15)
plt.show()# 3. 查看所有数值型特征两两之间的关系 (配对图)
sns.pairplot(df_scores[['数学成绩', '英语成绩', '科学成绩', '班级']], hue='班级', diag_kind='kde')
# diag_kind='kde' 在对角线上绘制核密度估计图
plt.suptitle('成绩数据配对关系图 (按班级)', y=1.02, fontsize=16) # 为整个 pairplot 添加总标题
plt.show()# 4. 查看不同班级各科成绩的箱线图
plt.figure(figsize=(10, 6))
sns.boxplot(data=pd.melt(df_scores, id_vars=['学生ID', '班级'], value_vars=['数学成绩', '英语成绩', '科学成绩'],var_name='科目', value_name='成绩'),x='班级', y='成绩', hue='科目')
# pd.melt 用于将宽格式数据转换为长格式数据,方便 boxplot 按科目分组
plt.title('各班级科目成绩箱线图', fontsize=15)
plt.show()
代码解释:
pd.melt()
: 这是一个非常有用的 Pandas 函数,可以将 DataFrame 从宽格式(每个科目一列)转换为长格式(一列表示科目名称,一列表示成绩),这对于某些 Seaborn 绘图函数(如boxplot
分组显示多个科目)非常方便。sns.pairplot()
: 能够快速生成数据集中数值型特征两两之间的散点图,以及每个特征自身的分布图(对角线上),是探索性数据分析的利器。- 在 Seaborn 函数中,
data
参数直接传入 DataFrame,然后通过字符串列名指定x
,y
,hue
等。
五、常见问题与选择建议
5.1 Matplotlib vs Seaborn:何时选择哪个?
-
Matplotlib:
- 优点: 极致的灵活性和控制力,几乎可以绘制任何类型的图表,是底层绘图库。
- 缺点: 对于复杂或统计相关的图形,代码量可能较大,默认样式相对朴素。
- 适用场景: 需要高度定制化图形、绘制非标准图表、进行精细的图形元素控制、集成到大型应用中作为绘图引擎。
-
Seaborn:
- 优点: 接口更高级,代码简洁,内置美观的主题和调色板,专注于统计可视化,能很好地与 Pandas DataFrame 集成。
- 缺点: 灵活性不如 Matplotlib,主要针对特定类型的统计图表。
- 适用场景: 快速探索性数据分析、绘制美观的统计图表(如分布图、关系图、分类图、热力图等)、希望用更少的代码获得更好的视觉效果。
实践建议:
- 对于简单的、快速的绘图或需要精细控制的场景,直接使用 Matplotlib。
- 对于统计分析和希望快速生成美观图形的场景,优先考虑 Seaborn。
- 通常两者结合使用:使用 Seaborn 进行主体绘图,然后使用 Matplotlib 的命令进行细节调整(如修改标题、标签、添加注解等)。
5.2 图像不显示或中文乱码问题
(1)图像不显示
- Jupyter Notebook/Lab: 通常会自动显示。如果不行,可以尝试在绘图代码的最后加上
plt.show()
。或者在 Notebook 开头执行%matplotlib inline
(用于静态图) 或%matplotlib notebook
(用于交互式图)。 - Python 脚本: 必须在绘图代码的最后调用
plt.show()
才能显示图形。
(2)中文乱码问题
Matplotlib 默认的字体可能不支持中文。解决方法通常有两种:
-
临时指定字体:
from matplotlib.font_manager import FontProperties font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=12) # 指定一个支持中文的字体文件路径# 在绘图时指定 plt.title("中文标题", fontproperties=font) plt.xlabel("X轴-中文", fontproperties=font)
-
全局修改配置 (推荐):
import matplotlib.pyplot as plt import seaborn as sns# 一次性设置,后续绘图均生效 plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体为黑体 plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题# seaborn 的风格设置也应该在这之后,或者单独为 seaborn 的文本元素指定字体 # sns.set(font='SimHei') # 可以尝试,但有时可能不完全覆盖所有 seaborn 元素# ... 正常的绘图代码 ... plt.title("你好,世界!") plt.xlabel("X轴") plt.plot([1,2,3], [4,5,1]) plt.show()
你需要确保你的系统中安装了
SimHei
(黑体) 或其他支持中文的字体。常见的可选字体有SimHei
(黑体),KaiTi
(楷体),FangSong
(仿宋),Microsoft YaHei
(微软雅黑) 等。
六、总结
本篇文章详细介绍了 Python 中两个核心的数据可视化库 Matplotlib 和 Seaborn,它们是进行数据分析和展示研究成果不可或缺的工具。
核心内容回顾:
- 数据可视化的重要性: 可视化帮助我们直观理解数据、发现模式与趋势,并清晰地传达分析结果。
- Matplotlib:
- 是 Python 可视化的基石,提供底层的绘图接口和高度的灵活性。
- 核心概念包括
Figure
(画布) 和Axes
(子图/绘图区域)。 - 学习了如何绘制基本的折线图、散点图、柱状图,并对图形进行定制(标题、标签、颜色、线型、图例等)。
- Seaborn:
- 构建于 Matplotlib 之上,提供更高级的接口,专注于创建美观且信息丰富的统计图形。
- 能够轻松设置绘图风格和调色板。
- 介绍了常用的绘图函数,如关系图 (
lineplot
,scatterplot
)、分类图 (boxplot
,barplot
)、分布图 (histplot
,kdeplot
,pairplot
) 和热力图 (heatmap
)。
- 实战应用:
- 演示了如何结合 NumPy 使用 Matplotlib 进行数组数据的可视化。
- 展示了如何利用 Seaborn 的便利性直接对 Pandas DataFrame 进行复杂的可视化分析。
- 选择与常见问题:
- 讨论了 Matplotlib 和 Seaborn 的适用场景和选择建议。
- 提供了解决图像不显示和中文乱码问题的方案。
掌握 Matplotlib 和 Seaborn,将为您的数据探索之旅增添一双锐利的眼睛。通过不断实践,您将能够根据不同的数据和分析需求,灵活运用这两个库,创造出既美观又富有洞察力的可视化作品。在后续的深度学习模型训练和评估中,这些可视化技巧也将大放异彩。