核心概念:.plot() 方法
Pandas DataFrame 和 Series 对象都有一个 .plot() 方法,这个方法实际上是 Matplotlib plot 函数的一个封装,让你可以直接在 DataFrame 上调用绘图功能。

基本语法:
DataFrame.plot(x=None, y=None, kind='line', **kwargs)
x: 用作 x 轴的数据列名或标签。y: 用作 y 轴的数据列名或标签,可以是单个列名,也可以是列名列表。kind: 指定绘图类型,这是最重要的参数,我们将在下面详细介绍。**kwargs: 其他所有参数都会传递给底层的 Matplotlib 函数,因此你可以使用 Matplotlib 的所有样式参数(如color,title,xlabel,ylabel,grid等)。
第一步:准备工作
确保你已经安装了必要的库。
pip install pandas matplotlib
导入它们并创建一个示例 DataFrame 用于演示。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 设置中文显示(可选,如果图表中包含中文)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 'SimHei' 是黑体,你也可以用 'Microsoft YaHei' 等
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 创建一个示例 DataFrame
data = {
'日期': pd.to_datetime(['2025-01-01', '2025-02-01', '2025-03-01', '2025-04-01', '2025-05-01']),
'产品A销量': [120, 150, 180, 210, 190],
'产品B销量': [90, 110, 140, 160, 170],
'成本': [80, 85, 95, 100, 98]
}
df = pd.DataFrame(data)
# 创建一个多指标的 DataFrame
data_multi = {
'类别': ['A', 'B', 'C', 'D'],
'销售额': [500, 750, 300, 900],
'利润率': [0.15, 0.22, 0.08, 0.25]
}
df_multi = pd.DataFrame(data_multi)
第二步:常用绘图类型 (kind 参数)
折线图 - kind='line' (默认)
折线图最适合展示数据随时间或其他连续变量的变化趋势。

# 绘制产品A销量的折线图 (默认)
df.plot(x='日期', y='产品A销量',
title='产品A销量趋势',
xlabel='日期',
ylabel='销量',
grid=True,
marker='o', # 数据点标记
linestyle='--') # 线条样式
plt.show()
# 绘制多个产品的销量对比图
df.plot(x='日期', y=['产品A销量', '产品B销量'],
title='产品A与产品B销量对比',
xlabel='日期',
ylabel='销量',
grid=True)
plt.show()
柱状图 - kind='bar' 或 kind='barh'
柱状图用于比较不同类别之间的数据大小。bar 是垂直柱状图,barh 是水平柱状图。
# 垂直柱状图
df_multi.plot(x='类别', y='销售额',
kind='bar',
title='各类别销售额',
xlabel='类别',
ylabel='销售额',
legend=False, # 不显示图例
color=['skyblue', 'lightgreen', 'salmon', 'gold']) # 自定义颜色
plt.show()
# 水平柱状图
df_multi.plot(x='类别', y='销售额',
kind='barh',
title='各类别销售额 (水平)',
color='coral')
plt.show()
饼图 - kind='pie'
饼图用于显示各个部分占整体的比例。
# 绘制销售额占比饼图
df_multi.plot(y='销售额',
kind='pie',
labels=df_multi['类别'], # 标签
autopct='%.1f%%', # 显示百分比,保留一位小数
startangle=90, # 起始角度
shadow=True, # 阴影
explode=(0, 0.1, 0, 0)) # 突出显示第二块'各类别销售额占比')
plt.ylabel('') # 隐藏y轴标签
plt.show()
直方图 - kind='hist'
直方图用于展示数据的分布情况,将数据分成若干“桶”(bins)来显示每个桶内的数据点数量。
# 假设我们有一组随机生成的身高数据
heights = np.random.normal(170, 10, 200)
df_heights = pd.DataFrame({'身高(cm)': heights})
df_heights.plot(kind='hist',
bins=20, # 分成20个桶
title='身高分布直方图',
xlabel='身高(cm)',
grid=True,
edgecolor='black') # 柱子边缘颜色
plt.show()
箱线图 - kind='box'
箱线图是一种用于显示数据分布情况的统计图,它可以展示中位数、四分位数、异常值等信息。

# 使用我们创建的 df DataFrame
df.plot(kind='box',
title='产品销量与成本箱线图',
ylabel='数值')
plt.show()
- 箱子的中间线是中位数。
- 箱子的上下边是第一四分位数 (Q1) 和第三四分位数 (Q3)。
- 箱子上的“须”延伸到 IQR(四分位距)的1.5倍,或者到数据的最小/最大值。
- 超出须的点被认为是异常值。
散点图 - kind='scatter'
散点图用于展示两个变量之间的关系。
# 绘制销售额与利润率的关系
df_multi.plot(kind='scatter',
x='销售额',
y='利润率',
title='销售额与利润率关系',
xlabel='销售额',
ylabel='利润率',
s=100, # 点的大小
c='red', # 点的颜色
alpha=0.7) # 透明度
plt.show()
面积图 - kind='area'
面积图是折线图的填充版本,强调数量随时间变化的累积效果。
# 绘制销量面积图
df.plot(x='日期', y=['产品A销量', '产品B销量'],
kind='area',
stacked=False, # 如果为True,两个面积会堆叠在一起
title='产品销量面积图',
alpha=0.4) # 透明度
plt.show()
第三步:高级自定义技巧
虽然 Pandas 的 .plot() 很方便,但有时我们需要更精细的控制,这时,可以结合 Matplotlib 进行深度定制。
获取和修改 Matplotlib 对象
.plot() 方法会返回一个 Matplotlib 的 Axes 对象,我们可以用它来修改图表。
# 绘制图表并获取 Axes 对象
ax = df.plot(x='日期', y='产品A销量',
title='自定义图表示例',
figsize=(10, 6)) # 设置图表大小
# 使用 Axes 对象进行修改
ax.set_xlabel('时间') # 修改x轴标签
ax.set_ylabel('销量 (件)') # 修改y轴标签
ax.legend(['产品A']) # 修改图例
ax.grid(True, linestyle=':', which='both', axis='both') # 自定义网格
# 添加注释
ax.annotate('销量高峰',
xy=('2025-04-01', 210), # 箭头指向的点
xytext=('2025-03-15', 230), # 文字位置
arrowprops=dict(facecolor='black', shrink=0.05))
plt.show()
使用 subplots 绘制子图
一个 DataFrame 可以一次性绘制多个子图。
# 将每一列作为一个子图绘制
axes = df.plot(subplots=True,
layout=(2, 2), # 2行2列的布局
figsize=(12, 8),
title='各指标子图展示',
sharex=True) # 共享x轴
# 调整子图之间的间距
plt.tight_layout()
plt.show()
使用 Seaborn 进行美化
Seaborn 是一个基于 Matplotlib 的高级可视化库,它提供了更美观的默认样式和更复杂的统计图表。
pip install seaborn
import seaborn as sns
# 使用 Seaborn 的风格
sns.set_theme(style="whitegrid")
# Seaborn 也可以直接使用 DataFrame
# 绘制一个更美观的柱状图
plt.figure(figsize=(8, 5))
ax = sns.barplot(x="类别", y="销售额", data=df_multi, palette="viridis")
ax.set_title('Seaborn 美化后的柱状图')
plt.show()
总结与最佳实践
| 图表类型 | 适用场景 | Pandas 代码示例 |
|---|---|---|
| 折线图 | 展示数据随时间/连续变量的趋势 | df.plot(kind='line', x='日期', y='值') |
| 柱状图 | 比较不同类别间的数据大小 | df.plot(kind='bar', x='类别', y='值') |
| 饼图 | 显示部分与整体的比例关系 | df.plot(kind='pie', y='值') |
| 直方图 | 展示单变量的数据分布 | df.plot(kind='hist', y='值') |
| 箱线图 | 展示数据的分布、离散程度和异常值 | df.plot(kind='box', y=['值1', '值2']) |
| 散点图 | 探索两个变量之间的相关性 | df.plot(kind='scatter', x='x值', y='y值') |
| 面积图 | 强调数量随时间变化的累积效果 | df.plot(kind='area', x='日期', y=['值1', '值2']) |
最佳实践:
- 先探索,后定制:先用 Pandas
.plot()快速生成图表,了解数据概貌。 - 明确目标:根据你想传达的信息选择合适的图表类型。
- 清晰标注:始终为图表添加标题、坐标轴标签和图例,确保信息清晰易懂。
- 适度美化:利用 Matplotlib 和 Seaborn 的功能调整颜色、字体、大小等,使图表更专业、更易读,但避免过度设计。
- 拥抱 Matplotlib:当 Pandas 的封装不够用时,大胆地获取
Axes对象,使用 Matplotlib 的强大功能进行深度定制。
希望这份详细的指南能帮助你熟练地使用 Pandas 进行数据可视化!
