准备工作:安装和导入库
在开始之前,请确保你已经安装了必要的库。Matplotlib 和 Seaborn 会和 NumPy 和 Pandas 一起安装。

pip install matplotlib seaborn numpy pandas
在 Notebook 的代码单元格中,首先需要导入这些库,为了方便,我们通常会给它们设置简短的别名。
# 导入核心库 import numpy as np import pandas as pd # 导入绘图库 import matplotlib.pyplot as plt import seaborn as sns # 设置一个让图表在 Notebook 中直接显示的“魔法命令” # 这是 Jupyter Notebook 和 Google Colab 的标准做法 %matplotlib inline
Matplotlib:基础绘图
Matplotlib 是 Python 最基础、最灵活的绘图库,是许多其他高级绘图库(如 Seaborn)的基础。
1 图表的基本结构
一个 Matplotlib 图表通常包含以下几个部分:
- Figure (画布): 整个图表的窗口或页面。
- Axes (坐标系): Figure 中的一个子图,包含坐标轴、刻度、标签等。
- Axis (坐标轴): X轴和Y轴。
- Title (标题): 图表的标题。
- Label (标签): X轴和Y轴的名称。
- Tick (刻度): 坐标轴上的刻度值。
- Legend (图例): 解释图表中不同线条或元素的含义。
2 创建第一个图表:折线图
让我们从最简单的折线图开始。

# 1. 准备数据
x = np.linspace(0, 10, 100) # 0到10之间生成100个点
y = np.sin(x)
# 2. 创建画布和坐标系
# plt.figure() 可以创建一个画布,这里我们先不使用,直接使用 plt.plot()
# plt.plot() 会自动创建一个坐标系
# 3. 绘制折线
plt.plot(x, y, label='sin(x)', color='blue', linestyle='--')
# 4. 添加图表元素"正弦函数曲线") # 标题
plt.xlabel("X 轴") # X轴标签
plt.ylabel("Y 轴") # Y轴标签
plt.grid(True) # 显示网格
plt.legend() # 显示图例
# 5. 显示图表
# 在 %matplotlib inline 模式下,plt.show() 不是必须的,但加上是良好习惯
plt.show()
代码解释:
np.linspace(0, 10, 100): 创建一个从0到10的等差数列,共100个点。plt.plot(x, y, ...): 核心绘图函数。x, y: 数据。label='sin(x)': 为这条线设置一个标签,用于图例。color='blue': 设置线条颜色。linestyle='--': 设置线条样式(虚线)。
plt.title(),plt.xlabel(),plt.ylabel(): 分别设置标题、X轴和Y轴的标签。plt.grid(True): 显示背景网格。plt.legend(): 根据设置的label显示图例。
3 其他基础图表类型
Matplotlib 支持几乎所有常见的图表类型。
散点图
# 准备数据
x = np.random.rand(50)
y = np.random.rand(50)
colors = np.random.rand(50)
sizes = 1000 * np.random.rand(50) # 点的大小
# 绘制散点图
plt.scatter(x, y, c=colors, s=sizes, alpha=0.5, cmap='viridis')
# 添加颜色条
plt.colorbar(label='颜色映射值')
"随机散点图")
plt.xlabel("X 值")
plt.ylabel("Y 值")
plt.show()
柱状图

# 准备数据
categories = ['A', 'B', 'C', 'D']
values = [15, 30, 45, 10]
# 绘制柱状图
plt.bar(categories, values, color=['red', 'blue', 'green', 'orange'])
"类别数据柱状图")
plt.xlabel("类别")
plt.ylabel("数值")
plt.show()
直方图 直方图用于展示数据的分布情况。
# 准备数据
data = np.random.randn(1000) # 生成1000个标准正态分布的随机数
# 绘制直方图
plt.hist(data, bins=30, color='purple', alpha=0.7) # bins 控制柱子的数量
"数据分布直方图")
plt.xlabel("数值")
plt.ylabel="频数"
plt.show()
Seaborn:高级统计绘图
Seaborn 基于 Matplotlib,提供了更高级的接口和更美观的默认样式,它特别适合用于绘制统计图表,并且能很好地与 Pandas DataFrame 结合。
1 Seaborn 的优势
- 美观的默认样式: 无需过多配置就能生成漂亮的图表。
- 内置数据集: 提供了许多经典的数据集供练习。
- 与 Pandas 无缝集成: 可以直接使用 DataFrame 的列名作为数据源。
- 专注于统计关系: 专门用于可视化数据之间的关系和分布。
2 使用 Seaborn 绘图
加载示例数据
Seaborn 自带了一些非常有名的数据集,tips(小费数据)和 iris(鸢尾花数据)。
# 加载 tips 数据集
tips = sns.load_dataset("tips")
# 查看数据前5行
tips.head()
输出:
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
关系图 - relplot
relplot 是一个高度灵活的函数,用于绘制关系图,默认是散点图,可以通过 kind 参数改为折线图。
# 绘制总账单和小费的关系,并用性别来着色 sns.relplot(data=tips, x="total_bill", y="tip", hue="sex", style="smoker") "总账单与小费的关系") plt.show()
hue="sex": 用sex列的数据为不同的点设置颜色。style="smoker": 用smoker列的数据为不同的点设置标记样式。
分布图 - displot
displot 用于可视化数据的分布,可以绘制直方图、核密度图等。
# 绘制总账单的分布直方图 sns.displot(data=tips, x="total_bill", bins=20, kde=True) # kde=True 会同时显示核密度估计曲线"总账单的分布") plt.show()
分类图 - catplot
catplot 用于可视化分类变量和数值变量之间的关系。
stripplot/swarmplot(抖动图/蜂群图)# 查看不同性别的小费分布 sns.catplot(data=tips, x="day", y="tip", hue="sex", kind="swarm") plt.title("按星期和性别的小费分布") plt.show()boxplot(箱线图)# 查看不同星期总账单的分布 sns.boxplot(data=tips, x="day", y="total_bill") plt.title("按星期总账单的箱线图") plt.show()violinplot(小提琴图) 箱线图和核密度图的结合。# 查看不同星期总账单的分布 sns.violinplot(data=tips, x="day", y="total_bill") plt.title("按星期总账单的小提琴图") plt.show()
回归图 - regplot / lmplot
用于可视化两个变量之间的线性关系。
# 绘制总账单和小费的回归关系图
sns.regplot(data=tips, x="total_bill", y="tip", scatter_kws={'alpha':0.3})
"总账单与小费的回归关系")
plt.show()
高级技巧与最佳实践
1 图表样式和主题
Seaborn 提供了多种内置主题,可以快速改变图表的整体风格。
# 设置主题为 "whitegrid" sns.set_theme(style="whitegrid") # 重新绘制一个图,看看效果 sns.boxplot(data=tips, x="day", y="total_bill")"使用 whitegrid 主题的箱线图") plt.show()
2 多子图
有时我们需要将多个图组合在一起,Matplotlib 提供了 plt.subplots() 来实现。
# 创建一个 2x2 的图表网格
fig, axes = plt.subplots(2, 2, figsize=(12, 10)) # figsize 设置整个画布大小
# 第一个子图:左上角 (0,0)
axes[0, 0].plot(x, y)
axes[0, 0].set_title("折线图")
# 第二个子图:右上角 (0,1)
axes[0, 1].scatter(tips['total_bill'], tips['tip'])
axes[0, 1].set_title("散点图")
# 第三个子图:左下角 (1,0)
axes[1, 0].hist(tips['total_bill'])
axes[1, 0].set_title("直方图")
# 第四个子图:右下角 (1,1)
axes[1, 1].bar(categories, values)
axes[1, 1].set_title("柱状图")
# 调整子图之间的间距,防止重叠
plt.tight_layout()
plt.show()
3 保存图表
使用 plt.savefig() 可以将图表保存为图片文件。
# 在绘制图表后调用
plt.figure(figsize=(8, 6))
sns.regplot(data=tips, x="total_bill", y="tip")"总账单与小费的回归关系")
# 保存为 PNG 文件,dpi 是分辨率
plt.savefig("my_plot.png", dpi=300)
# 保存为 PDF 文件(矢量图,适合打印)
# plt.savefig("my_plot.pdf")
plt.show()
总结与建议
| 库 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Matplotlib | - 基础、灵活,是所有库的基石 - 可定制性极强,能画出任何你想要的图表 |
- 代码相对繁琐 - 默认样式不够美观 |
- 需要高度自定义的图表 - 创建简单的、标准化的图表 |
| Seaborn | - 语法简洁,代码量少 - 默认美观,主题丰富 - 与 Pandas 深度集成,专为统计图表设计 |
- 定制性不如 Matplotlib 灵活 - 依赖 Matplotlib 作为底层引擎 |
- 快速探索数据之间的关系和分布 - 绘制各类统计图表(箱线图、小提琴图、热力图等) |
给初学者的建议:
- 从 Seaborn 开始: 对于大多数数据分析任务,Seaborn 是更好的起点,它能让你用更少的代码实现更专业的可视化效果。
- 遇到瓶颈时求助于 Matplotlib: 当你需要对图表进行非常精细的控制,而 Seaborn 无法满足时,再回到 Matplotlib,你需要理解 Seaborn 的图其实是构建在 Matplotlib 的
Figure和Axes之上的,所以两者可以混合使用。 - 勤加练习: 尝试用不同的图表类型去可视化你的数据,并思考哪种图表最能表达你想传达的信息,数据可视化是一门艺术,也是一门科学。
希望这份详细的指南能帮助你在 Python Notebook 中自由地绘制出精美的图表!
