自学教程 学编程从这里开始

Pandas 数据可视化

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()

十四、常用避坑清单

  1. 中文乱码:必须提前设置 font.sans-serif
  2. 饼图类别太多不适合,可读性差,优先柱状
  3. 散点图只适合数值,分类字段不能直接绘制
  4. 绘图前建议先聚合,不要直接丢原始明细(点太多、重叠)
  5. plt.show() 会清空画布;保存图片要放在 show 前面
  6. 时间折线图,日期列一定要先 pd.to_datetime 转换
  7. 多系列对比时,注意图例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 条笔记