Pandas 内置绘图接口基于 Matplotlib,开箱即用,适合快速探索数据、生成报表简图;搭配 Seaborn 可以美化图表。本文沿用销售明细数据集,讲解折线、柱状、饼图、直方图、箱线图、散点图、面积图等常用图,以及图例、标签、中文、子图、保存图片。
前置依赖
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
一、示例数据
data = {
"订单号": ["A001", "A002", "A003", "A004", "A005", "A006"],
"商品": ["键盘", "鼠标", "显示器", "键盘", "鼠标", "显示器"],
"数量": [2, 1, 1, 3, 2, 2],
"单价": [89, 45, 1200, 89, 45, 1200],
"下单日期": ["2026-10-01", "2026-10-02", "2026-10-03", "2026-10-04", "2026-10-04", "2026-10-05"]
}
df = pd.DataFrame(data)
df["金额"] = df["数量"] * df["单价"]
df["下单日期"] = pd.to_datetime(df["下单日期"])
# 分组汇总数据(绘图大多用汇总表)
df_group = df.groupby("商品", as_index=False).agg(
总数量=("数量", "sum"),
总金额=("金额", "sum")
)
# 按日期汇总
df_date = df.groupby("下单日期", as_index=False).agg(日销售额=("金额", "sum"))
二、基础绘图语法
Pandas 绘图两种写法等价:
# 方式1:Series / DataFrame 的 plot() 方法(推荐)
df_group.plot(x="商品", y="总金额", kind="bar")
# 方式2:plt 原生绘图
plt.bar(df_group["商品"], df_group["总金额"])
plt.show()
kind 可选类型:
line:折线图(默认)bar:柱状图,barh:横向柱状pie:饼图hist:直方图box:箱线图scatter:散点图area:面积图kde:核密度图
公共常用参数:
figsize=(10,4):画布大小title="标题"xlabel / ylabel:坐标轴名称legend=True:图例grid=True:网格线rot=0:x轴标签旋转角度color:颜色
三、柱状图(对比分类指标,最常用)
# 垂直柱状图
df_group.plot(
kind="bar",
x="商品",
y="总金额",
figsize=(6,4),
title="各商品销售总金额",
xlabel="商品",
ylabel="总金额",
color="#4472C4",
legend=False
)
plt.tight_layout()
plt.show()
# 横向柱状 barh
df_group.plot(
kind="barh",
x="商品",
y="总金额",
title="各商品销售总金额",
legend=False
)
plt.show()
适合:不同品类、部门、产品对比指标;类别多优先横向柱状。
四、折线图(时间趋势)
df_date.plot(
kind="line",
x="下单日期",
y="日销售额",
marker="o",
figsize=(8,4),
title="每日销售额趋势",
grid=True
)
plt.show()
适合:时间序列、指标随时间变化。
五、饼图(占比分析)
df_group.plot(
kind="pie",
y="总金额",
labels=df_group["商品"],
autopct="%.1f%%", # 显示百分比
startangle=90,
title="商品销售额占比"
)
plt.axis("equal") # 保证正圆形
plt.show()
适合:看结构占比;类别不要超过5个,太多会拥挤。
六、直方图 hist(数值分布)
看单个数值字段的分布区间
df["金额"].plot(
kind="hist",
bins=5,
title="单笔订单金额分布",
grid=True
)
plt.show()
bins:分箱数量,控制柱子多少
区分:直方图 hist(连续数值分布) vs 柱状图 bar(分类对比)
七、箱线图 box(识别异常值、四分位)
清洗、相关性分析配套使用,看离群值
df[["数量","单价"]].plot(
kind="box",
title="数量、单价箱线图"
)
plt.show()
箱线图:中位数、四分位、上下限,圆点代表异常值。
八、散点图 scatter(两个变量相关性)
配合前面相关性分析
df.plot(
kind="scatter",
x="数量",
y="金额",
s=80, # 点大小
c="red",
title="数量-金额散点图"
)
plt.show()
适合:观察两个数值变量的相关趋势。
九、面积图 area(累计趋势)
df_date.plot(
kind="area",
x="下单日期",
y="日销售额",
alpha=0.6, # 透明度
title="日销售额面积图"
)
plt.show()
十、核密度图 kde(平滑分布曲线)
df["金额"].plot(kind="kde", title="订单金额核密度分布")
plt.grid(True)
plt.show()
十一、多子图 subplots(一张画布多张图)
fig, axes = plt.subplots(2,2,figsize=(12,8))
# 子图1:柱状
df_group.plot(kind="bar", x="商品", y="总金额", ax=axes[0,0], legend=False)
axes[0,0].set_title("总金额柱状")
# 子图2:折线
df_date.plot(kind="line", x="下单日期", y="日销售额", ax=axes[0,1], marker="o")
axes[0,1].set_title("日销售趋势")
# 子图3:箱线
df[["金额"]].plot(kind="box", ax=axes[1,0])
axes[1,0].set_title("金额箱线")
# 子图4:散点
df.plot(kind="scatter", x="数量", y="金额", ax=axes[1,1])
axes[1,1].set_title("数量-金额散点")
plt.tight_layout()
plt.show()
核心:ax=axes[i,j] 指定绘图到哪个子图
十二、图表保存到本地
# 绘制之后,在show()之前保存
ax = df_group.plot(kind="bar", x="商品", y="总金额")
plt.savefig("sales_bar.png", dpi=300, bbox_inches="tight")
plt.show()
dpi=300:高清图片bbox_inches="tight":裁掉多余白边
十三、Seaborn 美化(进阶)
Pandas plot 快速出图,Seaborn 更美观,和pandas无缝配合
import seaborn as sns
sns.barplot(data=df_group, x="商品", y="总金额")
plt.title("Seaborn柱状图")
plt.show()
十四、常用避坑清单
- 中文乱码:必须提前设置
font.sans-serif - 饼图类别太多不适合,可读性差,优先柱状
- 散点图只适合数值,分类字段不能直接绘制
- 绘图前建议先聚合,不要直接丢原始明细(点太多、重叠)
plt.show()会清空画布;保存图片要放在 show 前面- 时间折线图,日期列一定要先
pd.to_datetime转换 - 多系列对比时,注意图例legend,避免重叠遮挡
十五、选型速查表
| 图表类型 | 适用场景 |
|---|---|
| bar / barh | 分类指标对比 |
| line | 时间趋势、连续指标变化 |
| pie | 占比结构分析 |
| hist / kde | 单变量数值分布 |
| box | 异常值、四分位探查 |
| scatter | 两个变量相关性 |
| area | 累计趋势 |
十六、实战流程模板
def plot_sales(df):
df_group = df.groupby("商品", as_index=False)["金额"].sum()
ax = df_group.plot(kind="bar", x="商品", y="金额", title="商品销售额", legend=False)
plt.tight_layout()
plt.savefig("sales.png", dpi=300, bbox_inches="tight")
plt.show()
return ax
0 条笔记