Pandas 绘图全能手册:12 类基础图一键绘制,覆盖所有原生绘图类型

日常做数据分析时,你是不是总以为 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)。

新手避坑指南(高频问题)

  1. 饼图报错:数据和为 0/NaN → 先过滤 / 填充 NaN,确保数据和 > 0;
  2. 散点图无显示:未指定x/y参数 → 散点图必须显式指定 x、y 列;
  3. 小提琴图报错:Pandas 版本过低 → 升级到 1.5+;
  4. 中文 / 负号乱码:未配置rcParams → 开头加入全局字体配置;
  5. 多列对比重叠:直方图 / KDE 图需调整alpha透明度。
相关推荐
程序猿零零漆4 小时前
Spring之旅 - 记录学习 Spring 框架的过程和经验(十四)SpringMVC的请求处理
学习·spring·pandas
weixin_462446238 小时前
Python 使用 PyQt5 + Pandas 实现 Excel(xlsx)批量合并工具(带图形界面)
python·qt·pandas
橙露1 天前
从零基础到实战:Python 数据分析三剑客(Pandas+NumPy+Matplotlib)核心应用指南
python·数据分析·pandas
清水白石0082 天前
手写超速 CSV 解析器:利用 multiprocessing 与 mmap 实现 10 倍 Pandas 加速
python·pandas
Hello.Reader4 天前
PyFlink 向量化 UDF(Vectorized UDF)Arrow 批传输原理、pandas 标量/聚合函数、配置与内存陷阱、五种写法一网打尽
python·flink·pandas
Hello.Reader4 天前
PyFlink Table API Data Types DataType 是什么、UDF 类型声明怎么写、Python / Pandas 类型映射一文搞懂
python·php·pandas
Hello.Reader4 天前
PyFlink Table API 用户自定义函数(UDF)通用 UDF vs Pandas UDF、打包部署、open 预加载资源、读取作业参数、单元测试
log4j·pandas
海棠AI实验室5 天前
第十六章:小项目 2 CSV → 清洗 → 统计 → 图表 → 报告输出
pandas
逻极5 天前
数据分析项目:Pandas + SQLAlchemy,从数据库到DataFrame的丝滑实战
python·mysql·数据分析·pandas·sqlalchemy