Seaborn 数据可视化入门与进阶
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) # 往外挪一点
三、调色板
三类调色板:
- 分类色(区分类别)
sns.color_palette("husl", 8) # 感知均匀
sns.color_palette("Set2") # 柔和
sns.color_palette("tab10") # 经典
- 顺序色(表示大小)
sns.color_palette("Blues", 6) # 蓝色渐变
sns.color_palette("viridis", 6) # 科学可视化常用
sns.color_palette("rocket", 6) # 橙红
- 全局设置
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()