JavaScript is required

2026-06-14-数据可视化 Vol.3 可视化库

关于 matplotlib、Seaborn 和 Pyecharts 三个库的内容

笔记#数据可视化

matplotlib / Seaborn


一、全局配置

字体配置:通过 rcParams 字典全局修改 matplotlib 的运行时配置参数。 font.sans-serif 指定无衬线字体族的回退列表,matplotlib 按列表顺序查找第一个系统中已安装的字体。 axes.unicode_minus 设为 False 是为了让 matplotlib 使用 ASCII 连字符 - 替代 Unicode 负号 −, 因为很多中文字体缺这个 Unicode 字符,会显示为方块 □。 这些配置放在 import 之后、任何绘图之前,对所有后续图表生效。

python
import matplotlib.pyplot as plt               # 导入 pyplot 模块,约定别名为 plt

# ===== 字体配置 =====
plt.rcParams['font.sans-serif'] = ['SimHei']   # 【字体配置】无衬线字体族列表,SimHei=黑体(Windows自带),
                                               # 也可用 'Microsoft YaHei'(微软雅黑)、'WenQuanYi Micro Hei'(Linux文泉驿)、
                                               # 'PingFang SC'(macOS苹方);matplotlib 按列表顺序查找第一个可用字体

plt.rcParams['axes.unicode_minus'] = False     # 【字体配置】关闭 Unicode 负号,用 ASCII '-' 替代 Unicode '−',
                                               # 避免中文字体缺失该字符导致负号显示为方块 □

# ===== 画布默认值 =====
plt.rcParams['figure.figsize'] = (8, 5)        # 全局默认画布尺寸:宽8英寸、高5英寸(所有未显式指定 figsize 的图都用这个)
plt.rcParams['figure.dpi'] = 100               # 全局默认分辨率:100 dots per inch,控制屏幕上图片的像素密度
                                               # 最终像素数 = figsize × dpi,如 8×100=800px 宽

二、Figure / Axes 创建区

子图: API 是 plt.subplots(),它一次性创建 Figure(画布容器)和 Axes(坐标轴/子图区域)对象。 nrows 和 ncols 定义子图网格的行列数,返回的 axes 是一个二维 NumPy 数组,通过 axes[row, col] 索引操作每个子图。 这是"面向对象"写法,比老的 plt.subplot() 更灵活——你可以对每个子图单独设置标题、刻度、图例等,互不干扰。 最后用 plt.tight_layout() 自动计算并调整子图之间的间距,防止标签文字重叠/被裁切。

单图

python
fig, ax = plt.subplots(figsize=(8, 5), dpi=100)
# 【子图】创建一个包含单个 Axes 的 Figure;fig 是整张画布,ax 是画布上的唯一坐标轴区域
# figsize 参数会覆盖全局 rcParams 中的默认值,单位是英寸 (width, height)
# dpi=100 表示该图的分辨率为 100 像素/英寸,最终像素 = 800×500

多子图(网格布局)

python
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8))
# 【子图】创建 2行×2列 共4个子图的网格,axes 是 shape=(2,2) 的 ndarray
# figsize=(10,8) 指定整个画布的大小(宽10,高8英寸),每个子图自动均分画布空间

axes[0, 0].plot(x1, y1, color='blue')        # 【子图】通过行列索引 [行, 列] 访问第1个子图,在上面画折线图
axes[0, 1].bar(x2, y2, color='orange')       # 【子图】访问第2个子图(第0行第1列),在上面画柱状图
axes[1, 0].scatter(x3, y3, color='green')    # 【子图】访问第3个子图(第1行第0列),在上面画散点图
axes[1, 1].hist(data, bins=20)               # 【子图】访问第4个子图(第1行第1列),在上面画直方图

# 遍历所有子图做统一设置(如添加标题、去边框)
for i, row in enumerate(axes):               # 遍历行
    for j, ax in enumerate(row):             # 遍历列
        ax.set_title(f'子图 {i+1},{j+1}')     # 【子图】给每个子图分别设置标题
        ax.spines['top'].set_visible(False)   # 去顶边框
        ax.spines['right'].set_visible(False) # 去右边框

plt.tight_layout()                           # 【子图】自动调整子图间距(padding),
                                             # 防止相邻子图的标签/标题重叠,是最后一步布局操作

plt.subplots 解包规则(易错点)

python
# nrows=1, ncols=1 时,axes 是单个对象,直接赋值
fig, ax = plt.subplots(1, 1)                 # ✅ ax 是 Axes 对象,可直接 .plot()

# nrows=1, ncols>1 时,axes 是一维数组
fig, axes = plt.subplots(1, 3)               # ✅ axes 是 shape=(3,) 的一维数组
axes[0].plot(x, y)                           # ✅ 用一维索引访问

# nrows>1, ncols>1 时,axes 是二维数组
fig, axes = plt.subplots(2, 3)               # ✅ axes 是 shape=(2,3) 的二维数组
axes[0, 1].plot(x, y)                        # ✅ 用二维索引 [行, 列] 访问

不规则子图布局(使用 subplot_mosaic,matplotlib 3.3+)

python
# 用字符串定义布局:每个字母代表一个子图,同一字母跨越多格表示合并
fig, axes = plt.subplot_mosaic([
    ['A', 'A', 'B'],     # 第1行:A 占2列,B 占1列
    ['A', 'A', 'C'],     # 第2行:A 继续占2列,C 占1列
    ['D', 'E', 'F'],     # 第3行:D、E、F 各占1列
], figsize=(10, 8))
# axes 是 dict,key 是布局字母:{'A': ax_A, 'B': ax_B, ...}
axes['A'].plot(x1, y1)                       # 【子图】A 是合并了2行×2列的大子图
axes['B'].bar(x2, y2)                        # 【子图】B 是右上角单格
axes['D'].scatter(x3, y3)                    # 【子图】D 是左下角单格

其他写法

python
plt.figure(figsize=(8, 5))                   # 先创建 Figure
plt.subplot(2, 2, 1)                         # 再逐个添加子图:(行数, 列数, 序号),序号从1开始
plt.plot(x, y)
plt.subplot(2, 2, 2)                         # 切换到第2个子图
plt.bar(x, y)
# 缺点:状态机写法,难以精确控制每个子图的属性

三、坐标轴与刻度区

刻度配置:刻度分为"刻度位置"(ticks,即数据坐标系中刻度线出现的位置)和"刻度标签"(tick labels, 即刻度线上方/旁边的文字)。配置分为四个层次:

① set_xticks() / set_yticks() — 设定刻度在数据轴上的位置(数值列表);

② set_xticklabels() / set_yticklabels() — 覆盖刻度标签文字(与刻度位置一一对应);

③ tick_params() — 统一控制所有刻度的视觉样式(旋转角度、字体大小、颜色、刻度线长度等);

④ set_xlim() / set_ylim() — 设定坐标轴的数值范围,超出范围的刻度不会显示。


四、常见图型


五、颜色与 colormap

cmap 怎么使用的:colormap(颜色映射表,简称 cmap)是一种将数值映射到颜色的查找表。 c=数值数组 + cmap='映射表名',matplotlib 自动完成映射:最小值→cmap最左颜色,最大值→cmap最右颜色。

  • 顺序数据(温度、人口):viridis(默认,色盲友好)、plasma、hot
  • 双向数据(相关系数、增长率,有正有负):coolwarm、RdBu(红蓝)、bwr
  • 分类数据(离散类别):Set1、tab10、Pastel1
  • 加 _r 后缀反转颜色顺序(如 viridis_r:黄→绿→蓝)

cmap 配合 plt.colorbar() 添加颜色条(图例),让读者知道颜色和数值的对应关系。


六、Seaborn

6.1 定义、加载与优势

Seaborn 是什么:Seaborn 是基于 matplotlib 构建的 Python 高级统计可视化库,由 Michael Waskom 开发。 它封装了 matplotlib 的底层绘图 API,提供面向 DataFrame 的高级接口,让统计图表能用一行代码完成。

python
import seaborn as sns          # 加载 Seaborn,约定别名 sns(取自电视剧《白宫风云》角色 Samuel Norman Seaborn)

Seaborn 相比裸 matplotlib 的优势:

优势说明对比 matplotlib
① DataFrame 原生支持直接传列名字符串(x='col1'),无需手动提取数组plt.plot(df['col1'], df['col2']) 需手动取列
② 自动分组着色hue='类别列' 一个参数完成分组+配色+图例需手动循环分组、选色、拼图例
③ 统计功能内置箱线图/小提琴图自动计算分位数;回归图自动拟合+置信区间需手动调用 numpy/scipy 计算
④ 默认美观自带精心设计的调色板和主题样式,开箱即用默认配色朴素,需大量手动美化
⑤ Figure-level APIpairplot、clustermap、catplot 等自动创建多子图布局需手动 subplots + 循环填充每个子图

6.2 风格特点

Seaborn 提供五大内置主题,通过 sns.set_theme() 一键切换整体视觉风格。 主题控制的是背景色、网格线、刻度线等"画布层面"的样式,不改变数据本身的绘制逻辑。

python
import seaborn as sns

# ===== 主题风格(style) =====
sns.set_theme(style='whitegrid')   # 白底+灰色网格线(最常用,商务图表首选)
sns.set_theme(style='darkgrid')    # 灰底+白色网格线(适合深色背景的演示文稿)
sns.set_theme(style='white')       # 纯白底无网格(极简风格,适合海报/信息图)
sns.set_theme(style='dark')        # 纯灰底无网格(与 darkgrid 类似但无网格)
sns.set_theme(style='ticks')       # 白底+刻度短线(Edward Tufte 推荐风格,最小化非数据元素)

# ===== 调色板(palette) =====
sns.set_theme(palette='deep')      # 默认10色,饱和度高,适合分类数据
sns.set_theme(palette='muted')     # 低饱和度版本,视觉更柔和(推荐用于论文)
sns.set_theme(palette='pastel')    # 粉彩色系,适合浅色背景
sns.set_theme(palette='bright')    # 高亮度色系,适合深色背景
sns.set_theme(palette='dark')      # 深色系
sns.set_theme(palette='colorblind')# 色盲友好色板(约8%男性色盲,学术/公开报告推荐)

# ===== 上下文缩放(context) =====
sns.set_context('paper')           # 论文用:小字体,适合嵌入 LaTeX/Word
sns.set_context('notebook')        # 默认:适中字体,适合 Jupyter Notebook
sns.set_context('talk')            # 演讲用:大字体,适合投影演示
sns.set_context('poster')          # 海报用:超大字体,适合打印展板
# context 会自动缩放所有文字元素(标签、刻度、图例)的字体大小

# ===== 一行设置全部 =====
sns.set_theme(style='whitegrid', palette='muted', context='notebook', font='SimHei')
# 同时设定:主题样式 + 调色板 + 上下文缩放 + 中文字体

6.3 与 Matplotlib 的关系

关系:Seaborn 是 matplotlib 的高级封装,不是替代品。 Seaborn 内部所有绘图最终都调用 matplotlib 的底层 API,返回的仍然是 matplotlib 的 Axes 对象。 这意味着:你可以用 Seaborn 快速出图,再用 matplotlib 的 API 做精细微调。

text
Seaborn(高层:DataFrame 直传、自动统计、默认美观)
    ↓ 调用
Matplotlib(底层:像素级控制、坐标轴定制、图表保存)

三种典型的协作模式:

python
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

df = pd.DataFrame({'x': range(5), 'y': [3,7,2,5,8]})

# ===== 模式1:Seaborn 画图 + Matplotlib 美化 =====
fig, ax = plt.subplots(figsize=(8, 5))        # matplotlib 创建画布
sns.barplot(x='x', y='y', data=df, ax=ax)      # Seaborn 在指定 ax 上绘图
ax.set_title('Seaborn画+Matplotlib美', fontsize=14)  # matplotlib 微调标题
ax.spines['top'].set_visible(False)             # matplotlib 去边框
ax.tick_params(labelsize=10)                    # matplotlib 调刻度
plt.tight_layout()                              # matplotlib 调布局

# ===== 模式2:纯 Seaborn Figure-level 函数(自动管理画布) =====
g = sns.pairplot(df)                            # pairplot 返回 PairGrid 对象
g.fig.suptitle('散点矩阵', y=1.02)               # 通过 .fig 访问底层 Figure 加总标题
# PairGrid / FacetGrid 是 Seaborn 独有的高级对象,.fig 是底层的 matplotlib Figure
# .axes 是底层的 matplotlib Axes 数组,可逐个微调

# ===== 模式3:Matplotlib 全局设置影响 Seaborn =====
plt.rcParams['font.sans-serif'] = ['SimHei']    # matplotlib 的 rcParams 对 Seaborn 同样生效
plt.rcParams['axes.unicode_minus'] = False
sns.set_theme(style='whitegrid')                 # Seaborn 主题覆盖部分 rcParams
# Seaborn 的 set_theme() 内部也是修改 rcParams,两者可混用但注意调用顺序:
# 先设 rcParams(字体等),再设 set_theme(主题),后者会覆盖前者冲突的键

API 层级对比:

层级matplotlibSeaborn何时用
Figure-levelplt.subplots() 手动创建sns.pairplot(), sns.catplot(), sns.displot(), sns.jointplot(), sns.clustermap()需要自动多子图布局时
Axes-levelax.plot(), ax.bar()sns.barplot(), sns.boxplot(), sns.heatmap(), sns.lineplot(), sns.scatterplot(), sns.histplot()画到指定 ax,嵌入自定义布局时
样式层plt.rcParamssns.set_theme(), sns.set_context()全局外观设置

6.4 相关图表 API


七、Pyecharts

7.1 定义、加载与特点

Pyecharts 是什么:Pyecharts 是百度开源 JavaScript 图表库 Apache ECharts 的 Python 封装, 由陈键冬等人开发维护。它将 ECharts 的配置项映射为 Python 的链式 API,让你用纯 Python 代码生成交互式网页图表。 与 matplotlib/Seaborn 生成静态图片不同,Pyecharts 输出的是 HTML 文件,内嵌 JavaScript,支持缩放、悬停提示、数据筛选等交互。

bash
pip install pyecharts          # 安装 Pyecharts(库,包含常用图表)
python
# ===== 加载方式:按需导入,不导入整个库 =====
from pyecharts.charts import Bar        # 柱状图
from pyecharts.charts import Line       # 折线图
from pyecharts.charts import Pie        # 饼图
from pyecharts.charts import Scatter    # 散点图
from pyecharts.charts import HeatMap    # 热力图
from pyecharts.charts import Map        # 地图
from pyecharts.charts import Geo        # 地理坐标系图
from pyecharts.charts import Graph      # 关系图/网络图
from pyecharts.charts import Sankey     # 桑基图
from pyecharts.charts import Radar      # 雷达图
from pyecharts.charts import Funnel     # 漏斗图
from pyecharts.charts import Gauge      # 仪表盘
from pyecharts.charts import Liquid     # 水球图
from pyecharts.charts import WordCloud  # 词云图
from pyecharts.charts import TreeMap    # 矩形树图
from pyecharts.charts import Sunburst   # 旭日图
from pyecharts.charts import Timeline   # 时间线轮播(容器)

from pyecharts import options as opts   # 全局配置项模块(标题、图例、工具箱、提示框等)
# opts 是最关键的模块,几乎所有图表属性都通过 opts.XXXOpts 类来配置

Pyecharts 的特点:

特点说明对比 matplotlib/Seaborn
① 交互式输出 HTML,支持鼠标悬停查看数值、缩放、拖拽、图例点击过滤matplotlib 生成静态图片,无交互
② 图表类型丰富覆盖 30+ 种图表类型,包括地图、桑基图、仪表盘、3D 图等matplotlib 偏基础统计图,地图/桑基图需额外库
③ 链式调用.add_xaxis().add_yaxis().set_global_opts() 流式 API 链式配置matplotlib 是函数调用式,每个属性单独设置
④ 配置项体系全局配置 set_global_opts() + 系列配置 set_series_opts(),分层清晰matplotlib 所有属性都在 ax 上调,层级扁平
⑤ 网页嵌入生成的 HTML 可在浏览器中独立运行,也可嵌入 Flask/Django/Jupytermatplotlib 图片需嵌入 <img> 标签

7.2 生成图表的主要步骤

Pyecharts 的图表创建遵循五步流程:初始化图表 → 添加数据 → 设置全局配置 → 设置系列配置 → 渲染输出。 所有图表类型共享相同的配置模式,学会一个就等于学会全部。

五步流程总结:

text
① Bar() / Line() / Pie() ...
        ↓
② .add_xaxis() + .add_yaxis()
        ↓
③ .set_global_opts()   ← 标题/图例/工具箱/提示框/坐标轴(跨系列共用)
        ↓
④ .set_series_opts()   ← 标签/标记点/标记线(按系列设置)
        ↓
⑤ .render('output.html')

7.3 可生成的图表类型

Pyecharts 继承 ECharts 的全部图表能力,分为以下几大类。

一类:基础统计图(与 matplotlib/Seaborn 重叠,但交互式)

二类:地理可视化(Pyecharts 最大亮点之一)

三类:关系与流程类

四类:特殊图表

7.4 Pyecharts 图表类型速查总表

分类图表导入路径典型场景
基础柱状图from pyecharts.charts import Bar类别对比
基础折线图from pyecharts.charts import Line趋势变化
基础饼图/环形图from pyecharts.charts import Pie占比分布
基础散点图from pyecharts.charts import Scatter相关性
基础箱线图from pyecharts.charts import Boxplot分布对比
基础热力图from pyecharts.charts import HeatMap矩阵数据
地理地图from pyecharts.charts import Map区域数据
地理地理坐标系from pyecharts.charts import Geo地理散点
关系关系图from pyecharts.charts import Graph网络拓扑
关系桑基图from pyecharts.charts import Sankey流量流向
关系漏斗图from pyecharts.charts import Funnel转化率
层级矩形树图from pyecharts.charts import TreeMap层级占比
层级旭日图from pyecharts.charts import Sunburst多层饼图
特殊仪表盘from pyecharts.charts import GaugeKPI 指标
特殊水球图from pyecharts.charts import Liquid进度百分比
特殊词云图from pyecharts.charts import WordCloud文本权重
特殊雷达图from pyecharts.charts import Radar多维对比
容器时间线轮播from pyecharts.charts import Timeline动态播放

7.5 Pyecharts vs Matplotlib/Seaborn 对比

维度PyechartsMatplotlib/Seaborn
输出格式HTML(交互式)PNG/SVG/PDF(静态)
交互性悬停、缩放、拖拽、图例筛选无(除非用 %matplotlib widget)
学习曲线中等(需理解 opts 配置体系)中等(需理解 figure/axes 对象)
图表类型30+ 种,含地图/桑基/仪表等基础统计图为主
中文支持原生完美支持需额外配置字体
网页嵌入天然适配,一个 HTML 搞定需先保存图片再嵌入
论文/出版不支持(无法导出矢量图)完美支持(PDF/SVG 矢量输出)
适用场景Web 看板、数据分析报告、交互仪表盘学术论文、出版物、静态报告

八、收尾区

python
plt.tight_layout(pad=1.5, h_pad=1.0, w_pad=1.0)
# 【子图】自动调整子图间距和边距;pad 控制 Figure 边缘与子图间的距离(英寸)
# h_pad/w_pad 控制子图之间的垂直/水平间距

plt.savefig('out.png', dpi=300, bbox_inches='tight', facecolor='white', transparent=False)
# dpi=300:输出分辨率300 DPI(出版级),图片像素 = figsize × dpi
# bbox_inches='tight':自动裁剪多余的空白边缘,让图片内容紧凑(最常用)
# bbox_inches=None 则保留完整画布(含白边);也可手动指定 bbox_inches=(-0.5,-0.5,8.5,5.5)
# facecolor='white':图片背景色设为白色;transparent=True 则背景透明(适合叠加到海报/网页)

plt.show()
# 显示所有已创建的 Figure;在 Jupyter 中通常自动显示,脚本中必须显式调用

九、模板