本节说明
DataFrame.plot与Series.plot是 pandas 最核心的绘图接口,覆盖 11 种图表类型与 27 个常用参数。
基本用法
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 准备示例数据
np.random.seed(42)
df = pd.DataFrame(np.random.randn(100, 3),
columns=['A', 'B', 'C'])
# 两种等价写法
df.plot(kind='line')
df.plot.line()
plt.show()图形显示
- Jupyter Notebook:默认自动内联显示。
- 脚本/终端:需调用
plt.show()。- 所有绘图方法返回 matplotlib
Axes对象,可继续链式调用 matplotlib API。
图表类型
kind 参数或「点号访问器」均可指定图表类型,两者完全等价:
| kind 参数 | 访问器方法 | 图表名称 | 典型场景 |
|---|---|---|---|
'line' | df.plot.line() | 折线图(默认) | 时间序列、趋势变化 |
'bar' | df.plot.bar() | 垂直柱状图 | 类别数值比较 |
'barh' | df.plot.barh() | 水平柱状图 | 类别名较长时的比较 |
'box' | df.plot.box() | 箱线图 | 分布、四分位数与异常值 |
'hist' | df.plot.hist() | 直方图 | 单变量频率分布 |
'kde' | df.plot.kde() | 核密度估计图 | 平滑概率密度曲线 |
'density' | df.plot.density() | 密度图 | kde 的别名 |
'area' | df.plot.area() | 面积图 | 累积量、贡献度变化 |
'pie' | df.plot.pie() | 饼图 | 占比构成 |
'scatter' | df.plot.scatter() | 散点图 | 两变量相关关系 |
'hexbin' | df.plot.hexbin() | 六边形分箱图 | 大数据量散点密度 |
1. 折线图 line
默认图表类型,适合展示连续型数据的变化趋势。
# 单 Series
s = pd.Series(np.cumsum(np.random.randn(100)))
s.plot(kind='line', figsize=(10, 4))
# 多列 DataFrame 自动生成图例
df.plot.line(figsize=(10, 4))2. 垂直柱状图 bar
df_bar = pd.DataFrame({'A': [3, 5, 2], 'B': [4, 6, 3]},
index=['X', 'Y', 'Z'])
df_bar.plot(kind='bar')
# 堆叠柱状图
df_bar.plot.bar(stacked=True)3. 水平柱状图 barh
df_bar.plot(kind='barh')
df_bar.plot.barh(stacked=True)4. 箱线图 box
展示最小值、Q1、中位数、Q3、最大值及异常值(以圆圈标记)。
df.plot(kind='box')
df.plot.box()
# 按分组绘制箱线图
df.boxplot(by='C') # 详见独立绘图方法5. 直方图 hist
df.plot(kind='hist', bins=20, alpha=0.5)
df.plot.hist(bins=20, alpha=0.5)
# 多列堆叠直方图
df.plot.hist(stacked=True, bins=30)6. 核密度估计图 kde / density
density是kde的别名,两者完全等价。
df.plot(kind='kde')
df.plot.kde()
df.plot.density()
# 叠加直方图更直观
df['A'].plot.hist(density=True, alpha=0.5)
df['A'].plot.kde()7. 面积图 area
df_area = pd.DataFrame(np.random.rand(10, 3),
columns=['A', 'B', 'C'])
df_area.plot(kind='area') # 默认堆叠
df_area.plot.area(stacked=False) # 取消堆叠8. 饼图 pie
注意:饼图通常需指定
y或使用subplots=True。
df_pie = pd.DataFrame({'value': [30, 25, 20, 15, 10]},
index=['A', 'B', 'C', 'D', 'E'])
df_pie.plot(kind='pie', y='value', autopct='%.1f%%')
# 每列一张饼图
df_pie.plot.pie(subplots=True, figsize=(8, 8))9. 散点图 scatter
必须指定
x与y参数。
df_scatter = pd.DataFrame(np.random.randn(100, 2),
columns=['X', 'Y'])
df_scatter.plot(kind='scatter', x='X', y='Y')
df_scatter.plot.scatter(x='X', y='Y', c='red', s=30)10. 六边形分箱图 hexbin
用于大数据量散点图,用六边形颜色深浅表示点密度,避免点重叠。
df_hex = pd.DataFrame({
'X': np.random.randn(5000),
'Y': np.random.randn(5000)
})
df_hex.plot(kind='hexbin', x='X', y='Y', gridsize=20, figsize=(8, 6))
df_hex.plot.hexbin(x='X', y='Y', gridsize=30, cmap='viridis')参数速记
scatter与hexbin必须提供x、y;hexbin额外常用gridsize(网格密度)、colormap、colorbar参数。
参数
df.plot() 的全部 27 个常用参数:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
x | label / position | None | x 轴使用的列标签或位置(scatter/hexbin 必填) |
y | label / position | None | y 轴使用的列标签或位置(scatter/hexbin 必填) |
kind | str | 'line' | 图表类型:line、bar、barh、box、hist、kde、density、area、pie、scatter、hexbin |
ax | matplotlib Axes | None | 指定绘制到哪个坐标轴对象上(用于多图合并) |
subplots | bool / sequence | False | 是否将每一列绘制为独立子图 |
sharex | bool | 'col' | 子图之间是否共享 x 轴 |
sharey | bool | False | 子图之间是否共享 y 轴 |
layout | tuple | None | 子图布局 (rows, cols),如 (2, 3) |
figsize | tuple | None | 图形尺寸 (width, height),单位英寸 |
title | str / list | None | 图表标题;配合 subplots=True 可传标题列表 |
legend | bool | True | 是否显示图例 |
label | label / list | None | 图例标签(覆盖列名) |
style | str / list | None | matplotlib 线条样式,如 'b-'、'g--'、'ro' |
logx | bool | False | x 轴使用对数刻度 |
logy | bool | False | y 轴使用对数刻度 |
loglog | bool | False | x、y 轴同时使用对数刻度 |
xlim | tuple / list | None | x 轴显示范围 (xmin, xmax) |
ylim | tuple / list | None | y 轴显示范围 (ymin, ymax) |
grid | bool | None | 是否显示网格线(None 时按 matplotlib 配置) |
colormap | str / Colormap | None | matplotlib 颜色映射,如 'viridis'、'plasma' |
colorbar | bool | None | 是否显示颜色条(hexbin 图常用) |
position | float | 0.5 | 柱状图柱的相对位置(0~1 之间) |
table | bool / Series / DataFrame | False | 是否在图表下方绘制数据表格 |
stacked | bool | False | 柱状图/面积图是否堆叠显示 |
secondary_y | bool / label / list | False | 是否使用右侧次 y 轴(可传列名列表) |
mark_right | bool | True | 使用次 y 轴时,图例标签是否标注在右侧 |
关键参数示例
# 子图 + 布局
df.plot(subplots=True, layout=(2, 2), figsize=(10, 8))
# 双 y 轴
df_dual = pd.DataFrame({'price': [1, 3, 2, 5],
'volume': [100, 300, 200, 500]})
df_dual.plot(secondary_y='volume', mark_right=True)
# 对数刻度
df_log = pd.DataFrame({'exp': np.exp(np.arange(10))})
df_log.plot(logy=True)
# 使用 colormap
df.plot(colormap='viridis')
# 图表下方附数据表
df_bar.plot.bar(table=True)
# 多图共享同一坐标轴
fig, ax = plt.subplots(figsize=(8, 4))
df['A'].plot(ax=ax, label='Series A')
df['B'].plot(ax=ax, label='Series B', style='--')
ax.legend()注意
style只能用于line类型,且多列时需传入与列数匹配的样式列表。secondary_y与subplots=True不能同时高效混用。hexbin依赖colorbar与colormap表达密度信息。
返回值
| 调用方式 | 返回值 |
|---|---|
单图(未指定 subplots) | matplotlib.axes.Axes |
多子图(subplots=True) | numpy.ndarray(元素为 Axes) |
指定 ax 参数 | 传入的 Axes 对象本身 |
🔗 相关笔记
- 独立绘图方法:2. 独立绘图方法
- pandas.plotting:3. pandas.plotting
- 绘图后端:4. 绘图后端
- 上游:知识大纲