Seaborn 数据可视化入门与进阶

Published by rcdfrd on 2026-01-12

Seaborn 数据可视化入门与进阶

用 Python 画统计图


一、Seaborn 是什么

Seaborn 是 Matplotlib 的封装库,画统计图更方便。和 Matplotlib 比:

  • 默认样式好看,不用调半天

  • 代码量少

  • 自带统计计算(置信区间、核密度估计)

  • 直接使用 Pandas DataFrame

    安装命令:

pip install seaborn

二、主题与样式

1. 设置主题

sns.set_theme() 一行搞定全局风格。

import seaborn as sns
import matplotlib.pyplot as plt

# 中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

sns.set_theme(style="whitegrid", font="SimHei")

style 参数:

特点 用在哪
white 纯白背景 论文、报告
whitegrid 白底带网格 看数值方便
dark 深色背景 PPT
darkgrid 深底带网格 数据多的图
ticks 带刻度线 要精确读数

2. 去边框

despine() 让图表干净点。

sns.despine()
sns.despine(offset=10, trim=True)  # 往外挪一点

三、调色板

三类调色板:

  1. 分类色(区分类别)
sns.color_palette("husl", 8)   # 感知均匀
sns.color_palette("Set2")      # 柔和
sns.color_palette("tab10")     # 经典
  1. 顺序色(表示大小)
sns.color_palette("Blues", 6)   # 蓝色渐变
sns.color_palette("viridis", 6) # 科学可视化常用
sns.color_palette("rocket", 6)  # 橙红
  1. 全局设置
sns.set_palette("muted")

四、常用图表

1. 分布图

sns.histplot(data=df, x="value", kde=True)  # 直方图+密度曲线
sns.boxplot(data=df, x="category", y="value")  # 箱线图
sns.violinplot(data=df, x="category", y="value")  # 小提琴图

2. 关系图

sns.scatterplot(data=df, x="x", y="y", hue="category")  # 散点
sns.lineplot(data=df, x="time", y="value", hue="group")  # 折线,自带置信区间

3. 分类图

sns.barplot(data=df, x="category", y="value")  # 条形
sns.countplot(data=df, x="category")  # 计数

五、实战

例 1:横向条形图

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

df = pd.DataFrame({
    "产品": ["产品A", "产品B", "产品C", "产品D", "产品E"],
    "销量": [120, 98, 86, 72, 65]
})

plt.rcParams['font.sans-serif'] = ['SimHei']
sns.set_theme(style="white")
fig, ax = plt.subplots(figsize=(10, 6))

colors = sns.color_palette("Blues_r", len(df))
sns.barplot(data=df, x="销量", y="产品", hue="产品", palette=colors, legend=False, ax=ax)

sns.despine(top=True, right=True)
ax.set_xlabel("销量(万件)", fontsize=12)
ax.set_title("年度产品销量排行", fontweight="bold", fontsize=16)

plt.tight_layout()
plt.show()

例 2:分组对比

import pandas as pd

df_group = pd.DataFrame({
    "月份": ["1月", "2月", "3月"] * 2,
    "销量": [100, 120, 150, 80, 95, 110],
    "地区": ["北方"] * 3 + ["南方"] * 3
})

sns.set_theme(style="whitegrid", font="SimHei")
sns.barplot(data=df_group, x="月份", y="销量", hue="地区", palette="Set2")

plt.title("南北方季度销量对比")
plt.show()