本节说明

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 个常用参数:

参数类型默认值说明
xlabel / positionNonex 轴使用的列标签或位置(scatter/hexbin 必填)
ylabel / positionNoney 轴使用的列标签或位置(scatter/hexbin 必填)
kindstr'line'图表类型:line、bar、barh、box、hist、kde、density、area、pie、scatter、hexbin
axmatplotlib AxesNone指定绘制到哪个坐标轴对象上(用于多图合并)
subplotsbool / sequenceFalse是否将每一列绘制为独立子图
sharexbool'col'子图之间是否共享 x 轴
shareyboolFalse子图之间是否共享 y 轴
layouttupleNone子图布局 (rows, cols),如 (2, 3)
figsizetupleNone图形尺寸 (width, height),单位英寸
titlestr / listNone图表标题;配合 subplots=True 可传标题列表
legendboolTrue是否显示图例
labellabel / listNone图例标签(覆盖列名)
stylestr / listNonematplotlib 线条样式,如 'b-'、'g--'、'ro'
logxboolFalsex 轴使用对数刻度
logyboolFalsey 轴使用对数刻度
loglogboolFalsex、y 轴同时使用对数刻度
xlimtuple / listNonex 轴显示范围 (xmin, xmax)
ylimtuple / listNoney 轴显示范围 (ymin, ymax)
gridboolNone是否显示网格线(None 时按 matplotlib 配置)
colormapstr / ColormapNonematplotlib 颜色映射,如 'viridis'、'plasma'
colorbarboolNone是否显示颜色条(hexbin 图常用)
positionfloat0.5柱状图柱的相对位置(0~1 之间)
tablebool / Series / DataFrameFalse是否在图表下方绘制数据表格
stackedboolFalse柱状图/面积图是否堆叠显示
secondary_ybool / label / listFalse是否使用右侧次 y 轴(可传列名列表)
mark_rightboolTrue使用次 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 对象本身

🔗 相关笔记