日常做数据分析时,你是不是总以为 Pandas 只擅长数据处理,绘图得靠 Matplotlib/Seaborn?其实 Pandas 内置了完整的绘图体系,基于 Matplotlib 封装但更简洁 ------一行代码就能搞定 12 类基础可视化,覆盖从简单趋势到复杂分布的所有原生绘图需求,不用再写繁琐的底层绘图代码!
本文将系统性拆解 Pandas 支持的所有基础绘图类型,每类图都附「核心语法 + 参数解读 + 实战案例」,新手也能直接复制运行,彻底掌握 Pandas 原生绘图的 "全家底"。
先搞懂:Pandas 绘图的底层逻辑
Pandas 的绘图功能基于 Matplotlib 实现,核心入口是DataFrame.plot()或Series.plot()(可简写为plot()),通过指定kind参数选择绘图类型(也可直接调用plot.line()/plot.bar()等专用方法)。
环境准备(通用配置,后文案例均基于此):
python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 全局配置:解决中文显示、负号显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 构造测试数据(覆盖多场景需求)
np.random.seed(42) # 固定随机种子,结果可复现
df = pd.DataFrame({
'销量': np.random.randint(100, 500, size=30),
'利润': np.random.randn(30) * 50 + 200,
'品类': np.random.choice(['A', 'B', 'C'], size=30),
'单价': np.random.uniform(10, 50, size=30),
'日期': pd.date_range('2026-01-01', periods=30)
})
# 补充缺失值/异常值(模拟真实数据)
df.loc[5, '利润'] = np.nan
df.loc[15, '销量'] = 1000 # 异常值
一、线性图(plot.line):趋势分析首选
线性图是 Pandas 绘图最基础的类型,默认不指定kind时即为线性图,适合展示数据随时间 / 序列的变化趋势。
核心能力 & 语法
python
# 1. 单列线性图(Series.plot)
df['销量'].plot(kind='line', figsize=(10, 5), title='每日销量趋势')
plt.show()
# 2. 多列对比线性图(DataFrame.plot)
df[['销量', '利润']].plot(
kind='line',
figsize=(10, 5),
title='销量&利润趋势对比',
logy=False, # 关闭对数刻度(需时设为True)
grid=True, # 显示网格
style=['-o', '--'] # 自定义线条样式:实线+圆点、虚线
)
plt.show()
# 3. 时间索引线性图(自动格式化时间轴)
df.set_index('日期')[['销量']].plot(
kind='line',
title='2026年1月销量时序趋势',
xlabel='日期',
ylabel='销量'
)
plt.show()
关键参数
- logx/logy:对数刻度,适合数据跨度大的场景;
- style:线条样式(如'-'实线、'--'虚线、'-o'带点实线);
- x/y:指定 x/y 轴列名(默认用索引做 x 轴)。
二、柱状图(plot.bar/barh):分类对比神器
柱状图适合展示分类数据的数值对比,bar为垂直柱状图,barh为水平柱状图,支持单组、多组、堆叠样式。
核心能力 & 语法
python
# 1. 单组垂直柱状图(按品类聚合销量)
df_group = df.groupby('品类')['销量'].sum()
df_group.plot(
kind='bar',
figsize=(8, 5),
title='各品类销量汇总',
color=['#FF6B6B', '#4ECDC4', '#45B7D1'], # 自定义颜色
rot=0 # x轴标签旋转角度(0为水平)
)
plt.show()
# 2. 多组堆叠柱状图(品类+销量/利润双指标)
df_group2 = df.groupby('品类')[['销量', '利润']].sum()
df_group2.plot(
kind='bar',
stacked=True, # 堆叠模式
title='各品类销量&利润堆叠对比',
ylabel='金额'
)
plt.show()
# 3. 水平柱状图(避免分类名过长)
df_group2.plot(
kind='barh',
title='各品类销量&利润水平对比',
xlabel='金额'
)
plt.show()
关键参数
- stacked:是否堆叠(默认 False);
- color:指定单 / 多列颜色(列表形式);
- rot:x 轴标签旋转角度(垂直柱状图常用)。
三、直方图(plot.hist):分布特征分析
直方图展示数据的分布情况,核心是 "分箱(bin)"------ 将数值范围划分为若干区间,统计每个区间的样本数,支持累计直方图。
核心能力 & 语法
python
# 1. 单列直方图(利润分布)
df['利润'].dropna().plot(
kind='hist',
figsize=(8, 5),
bins=10, # 分箱数(默认10)
title='利润分布直方图',
cumulative=False # 非累计
)
plt.show()
# 2. 多列对比直方图(销量+利润)
df[['销量', '利润']].dropna().plot(
kind='hist',
bins=15,
alpha=0.7, # 透明度(避免重叠遮挡)
title='销量&利润分布对比'
)
plt.show()
# 3. 累计直方图(查看分位数分布)
df['销量'].plot(
kind='hist',
cumulative=True,
title='销量累计分布直方图',
ylabel='累计占比'
)
plt.show()
关键参数
- bins:分箱数(值越大区间越细);
- alpha:透明度(0-1,多列对比必调);
- cumulative:是否累计(默认 False)。
四、散点图(plot.scatter):双变量关系分析
散点图展示两个数值变量的相关性,还能通过颜色 / 大小映射第三个变量,适合多维度关联分析。
核心能力 & 语法
python
# 1. 基础散点图(单价vs销量)
df.plot(
kind='scatter',
x='单价',
y='销量',
figsize=(8, 5),
title='单价vs销量散点图',
s=50 # 点的大小
)
plt.show()
# 2. 多维度散点图(颜色映射品类,大小映射利润)
df.dropna().plot(
kind='scatter',
x='单价',
y='销量',
c=df.dropna()['品类'].map({'A':0, 'B':1, 'C':2}), # 颜色映射
cmap='viridis', # 配色方案
s=df.dropna()['利润']/5, # 大小映射利润(缩放后更美观)
title='单价vs销量(颜色=品类,大小=利润)',
colorbar=True # 显示颜色刻度条
)
plt.show()
关键参数
- x/y:必须指定(散点图无默认列);
- c:颜色映射(数值 / 分类,分类需转数值);
- s:点的大小(支持数值列映射);
- cmap:配色方案(Matplotlib 配色均可复用)。
五、饼图(plot.pie):占比分析
饼图展示各分类的占比,支持百分比标注、缺省值处理,注意:数据和需为非负,且避免分类过多(建议≤8 类)。
核心能力 & 语法
python
# 1. 基础饼图(品类销量占比)
df_group = df.groupby('品类')['销量'].sum()
df_group.plot(
kind='pie',
figsize=(8, 8),
title='各品类销量占比',
autopct='%1.1f%%', # 显示百分比(保留1位小数)
startangle=90, # 起始角度(90度为垂直向上)
labels=None, # 隐藏默认标签(用legend展示)
legend=True, # 显示图例
ylabel='' # 隐藏y轴标签(饼图无需y轴)
)
plt.show()
# 2. 处理缺省值(填充NaN/过滤)
df_with_nan = pd.Series([10, 20, np.nan, 30], index=['a', 'b', 'c', 'd'])
# 方式1:填充NaN为0
df_with_nan.fillna(0).plot(kind='pie', autopct='%1.1f%%', title='填充NaN后占比')
plt.show()
# 方式2:过滤NaN
df_with_nan.dropna().plot(kind='pie', autopct='%1.1f%%', title='过滤NaN后占比')
plt.show()
关键参数
- autopct:百分比格式(如%1.2f%%保留 2 位小数);
- startangle:起始角度(调整饼图方向);
- explode:突出显示某一分类(如[0.1, 0, 0]突出第一类)。
六、箱线图(plot.box):异常值 & 分布分析
箱线图(盒须图)展示数据的四分位数、中位数、异常值,适合快速识别异常值和数据离散程度。
核心能力 & 语法
python
# 1. 单列箱线图(销量分布+异常值)
df['销量'].plot(
kind='box',
figsize=(6, 5),
title='销量箱线图(异常值标注)',
vert=False # 水平箱线图
)
plt.show()
# 2. 分组箱线图(按品类看利润分布)
df.boxplot(
column='利润',
by='品类', # 按品类分组
figsize=(8, 5),
title='各品类利润分布箱线图'
)
plt.suptitle('') # 关闭自动生成的标题(避免重复)
plt.show()
# 3. 多列箱线图(销量+利润对比)
df[['销量', '利润']].dropna().plot(
kind='box',
title='销量&利润分布对比箱线图'
)
plt.show()
关键参数
- vert:是否垂直(默认 True,水平设为 False);
- showfliers:是否显示异常值(默认 True,隐藏设为 False);
- by:分组列名(分组箱线图核心参数)。
七、面积图(plot.area):趋势 + 占比双重展示
面积图是线性图的扩展,通过填充线条下方区域,直观展示 "总量 + 各部分占比",支持普通 / 堆叠模式。
核心能力 & 语法
python
# 1. 普通面积图(销量趋势)
df.set_index('日期')['销量'].plot(
kind='area',
figsize=(10, 5),
title='销量趋势面积图',
alpha=0.7, # 填充透明度
ylabel='销量'
)
plt.show()
# 2. 堆叠面积图(按品类聚合后)
df_stack = df.groupby(['日期', '品类'])['销量'].sum().unstack() # 宽表转换
df_stack.plot(
kind='area',
stacked=True, # 堆叠模式
title='各品类销量堆叠面积图',
alpha=0.8,
legend=True
)
plt.show()
关键参数
- stacked:是否堆叠(默认 True,普通面积图设为 False);
- alpha:填充透明度(避免色块过浓);
- y:指定数值列(支持多列)。
八、核密度图(plot.kde):平滑分布分析
核密度图(KDE)是直方图的平滑版本,更直观展示数据的连续分布特征,支持累计 KDE。
核心能力 & 语法
python
# 1. 单列KDE图(利润分布)
df['利润'].dropna().plot(
kind='kde',
figsize=(8, 5),
title='利润核密度图',
bw_method=0.5 # 带宽(值越小越精细)
)
plt.show()
# 2. 多列KDE对比(销量+利润)
df[['销量', '利润']].dropna().plot(
kind='kde',
title='销量&利润核密度对比',
linestyle=['-', '--']
)
plt.show()
# 3. 累计KDE图
df['销量'].plot(
kind='kde',
cumulative=True,
title='销量累计核密度图'
)
plt.show()
关键参数
- bw_method:带宽(控制平滑程度,可选scott/silverman或自定义数值);
- cumulative:是否累计(默认 False)。
九、六边形分箱图(plot.hexbin):高密散点替代
当散点图数据量过大(上万 / 百万级),点会重叠无法分辨,六边形分箱图将坐标平面划分为六边形,用颜色表示每个六边形内的样本数,适合高密数据分布分析。
核心能力 & 语法
python
# 构造高密测试数据(10000条)
df_hex = pd.DataFrame({
'x': np.random.randn(10000),
'y': np.random.randn(10000)
})
# 六边形分箱图
df_hex.plot(
kind='hexbin',
x='x',
y='y',
figsize=(8, 6),
gridsize=30, # 六边形网格数(值越大分箱越细)
cmap='Blues', # 配色(深色=样本数多)
title='高密数据六边形分箱图',
colorbar=True # 显示颜色刻度条
)
plt.show()
关键参数
- gridsize:网格数(默认 100,值越大分箱越细);
- cmap:配色方案(建议用单色系,如 Blues、Reds);
- x/y:必须指定(无默认列)。
十、误差棒图(plot.errorbar):均值 ± 误差展示
误差棒图展示数据的均值(或中位数)及误差范围(标准差 / 标准误 / 置信区间),适合实验数据、统计分析场景。
核心能力 & 语法
python
# 按品类聚合:计算均值+标准差
df_error = df.groupby('品类')['利润'].agg(['mean', 'std']).dropna()
# 误差棒图(均值±标准差)
df_error['mean'].plot(
kind='errorbar',
yerr=df_error['std'], # 误差值(标准差)
figsize=(8, 5),
title='各品类利润均值±标准差',
capsize=5, # 误差棒两端横线长度
fmt='o-', # 点+线样式
color='red'
)
plt.show()
# 自定义上下误差(不对称误差)
df_error['lower'] = df_error['mean'] - df_error['std']*0.8
df_error['upper'] = df_error['mean'] + df_error['std']*1.2
df_error['mean'].plot(
kind='errorbar',
yerr=[df_error['mean']-df_error['lower'], df_error['upper']-df_error['mean']],
title='各品类利润不对称误差棒图',
capsize=5
)
plt.show()
关键参数
- yerr/xerr:误差值(单值 = 对称误差,列表 = 不对称误差);
- capsize:误差棒两端横线长度(提升可读性);
- fmt:数据点 + 线条样式(如'o'仅点、'-'仅线)。
十一、小提琴图(plot.violin):分布 + 分位数融合
小提琴图是箱线图 + 核密度图的结合,既展示四分位数,又展示数据的分布密度,Pandas 1.5 + 版本支持。
核心能力 & 语法
python
# 1. 单列小提琴图(销量分布)
df['销量'].plot(
kind='violin',
figsize=(6, 5),
title='销量小提琴图',
vert=False
)
plt.show()
# 2. 分组小提琴图(按品类看利润)
df.violinplot(
column='利润',
by='品类',
figsize=(8, 5),
title='各品类利润小提琴图'
)
plt.suptitle('')
plt.show()
关键参数
- vert:是否垂直(默认 True);
- showmeans/showmedians:是否显示均值 / 中位数(默认 False);
- by:分组列名(分组小提琴图核心)。
十二、马赛克图(plot.mosaic):分类交叉占比
马赛克图(也叫 "马赛克矩阵")展示两个 / 多个分类变量的交叉占比,适合分析分类变量的组合分布。
核心能力 & 语法
python
# 构造交叉分类数据
df_mosaic = df.groupby(['品类', df['销量']>300]).size().unstack()
# 填充NaN(无数据的交叉组合)
df_mosaic = df_mosaic.fillna(0)
# 马赛克图(品类×销量是否>300)
df_mosaic.plot(
kind='mosaic',
figsize=(8, 6),
title='品类×销量是否达标 马赛克图',
label_rotation=0,
colors=['#FFEAA7', '#81ECEC']
)
plt.show()
关键参数
- label_rotation:标签旋转角度;
- colors:指定交叉分类的颜色;
- gap:分类之间的间隙(默认 0.05)。
新手避坑指南(高频问题)
- 饼图报错:数据和为 0/NaN → 先过滤 / 填充 NaN,确保数据和 > 0;
- 散点图无显示:未指定x/y参数 → 散点图必须显式指定 x、y 列;
- 小提琴图报错:Pandas 版本过低 → 升级到 1.5+;
- 中文 / 负号乱码:未配置rcParams → 开头加入全局字体配置;
- 多列对比重叠:直方图 / KDE 图需调整alpha透明度。