Pandas 可视化基础

数据可视化是数据分析中不可或缺的一环。Pandas 内置了基于 Matplotlib 的简单绘图接口,让你可以快速从 DataFrame 和 Series 创建常用图表,无需繁琐的绘图代码。本章将介绍如何使用 Pandas 的 .plot() 方法绘制各种图形,并进行基础定制。

📌 准备工作

首先导入必要的库,并创建一些示例数据用于绘图演示。

import pandas as pd
import numpy as np

# 设置中文显示(如果需要)
# plt.rcParams['font.sans-serif'] = ['SimHei']  # 根据系统调整

# 创建时间序列数据
dates = pd.date_range('2024-01-01', periods=100, freq='D')
ts = pd.Series(np.random.randn(100).cumsum(), index=dates, name='Value')

# 创建分类汇总数据
df = pd.DataFrame({
    '类别': ['A', 'B', 'C', 'D'],
    '数值': [23, 45, 56, 78],
    '占比': [0.15, 0.30, 0.25, 0.30]
})

# 创建随机数据框
df_scatter = pd.DataFrame(np.random.randn(50, 4), columns=['A', 'B', 'C', 'D'])

📈 折线图 (Line Plot)

折线图是时间序列最常用的图表,Series.plot()DataFrame.plot() 默认都绘制折线图。

# Series 折线图
ts.plot(figsize=(10, 5), title='随机游走序列')
plt.ylabel('值')
plt.show()

# DataFrame 多列折线图
df_scatter.plot(figsize=(10, 5), title='多条折线')
plt.legend(loc='best')
plt.show()

📊 柱状图 (Bar Plot)

通过指定 kind='bar'kind='barh' 可以绘制垂直或水平柱状图。

# 垂直柱状图
df.plot(x='类别', y='数值', kind='bar', title='各类别数值', legend=False)

# 水平柱状图
df.plot(x='类别', y='数值', kind='barh', title='水平柱状图')

# 多列分组柱状图
df.set_index('类别')[['数值', '占比']].plot(kind='bar', title='分组柱状图')

📉 直方图 (Histogram)

直方图用于查看数据分布,使用 kind='hist'

# 单列直方图
ts.plot(kind='hist', bins=20, title='值分布', alpha=0.7)

# 多列直方图
df_scatter.plot(kind='hist', bins=20, alpha=0.5, title='多列分布叠加')

# 密度图(核密度估计)
df_scatter.plot(kind='kde', title='密度图')

🔵 散点图 (Scatter Plot)

散点图用于查看两个数值变量之间的关系,需要指定 xy 列。

# 创建两列数据
scatter_data = pd.DataFrame({'X': np.random.randn(100), 'Y': np.random.randn(100)})
scatter_data.plot(kind='scatter', x='X', y='Y', title='散点图')

# 可以通过 c 参数指定颜色列,s 指定大小
scatter_data['颜色'] = np.random.choice(['red','blue','green'], 100)
scatter_data['大小'] = np.random.randint(20, 200, 100)
# 注意:Pandas 绘图对颜色列支持有限,建议用 matplotlib 定制

📦 箱线图 (Box Plot)

箱线图展示数据的五数概括(最小值、第一四分位数、中位数、第三四分位数、最大值)以及异常值。

# 单列箱线图
df_scatter[['A', 'B']].plot(kind='box', title='箱线图')

# 也可以使用 DataFrame.boxplot() 方法
df_scatter.boxplot(column=['A','B','C'])

📐 面积图 (Area Plot)

面积图类似于折线图,但填充了折线与轴之间的区域,适合展示累积量。

# 创建累积数据
area_data = pd.DataFrame(np.random.rand(10, 4), columns=['A','B','C','D'])
area_data.plot(kind='area', stacked=True, alpha=0.5, title='面积图')

# 非堆叠
area_data.plot(kind='area', stacked=False, alpha=0.5)

⚙️ 常用参数

.plot() 方法支持许多常用参数,用于定制图表外观。

figsize=(宽, 高) title='标题' xlabel/ylabel legend=True/False color='颜色' grid=True/False linestyle/linewidth alpha=透明度 rot=旋转角度 fontsize
# 示例:自定义折线图
ts.plot(
    figsize=(12, 4),
    title='自定义折线图',
    color='red',
    linestyle='--',
    linewidth=2,
    grid=True,
    fontsize=12,
    rot=45
)
plt.xlabel('日期')
plt.ylabel('数值')
plt.show()

🎨 子图 (subplots)

使用 subplots=True 可以将多列数据分别绘制在不同的子图中。

df_scatter.plot(subplots=True, figsize=(10, 8), layout=(2,2), title='各列子图')
plt.tight_layout()
plt.show()

🧪 综合示例:销售数据分析

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 生成模拟销售数据
sales = pd.DataFrame({
    '日期': pd.date_range('2024-01-01', periods=90, freq='D'),
    '产品A': np.random.randint(50, 150, 90).cumsum(),
    '产品B': np.random.randint(30, 100, 90).cumsum(),
    '产品C': np.random.randint(20, 80, 90).cumsum(),
    '折扣': np.random.choice([0.9, 1.0, 0.8], 90)
})
sales.set_index('日期', inplace=True)

print(sales.head())

# 1. 绘制三个产品的销售趋势折线图
ax = sales[['产品A', '产品B', '产品C']].plot(figsize=(12, 5), title='产品销售趋势')
ax.set_ylabel('累计销售额')
plt.show()

# 2. 绘制折扣的柱状分布
sales['折扣'].value_counts().sort_index().plot(kind='bar', title='折扣分布')

# 3. 绘制产品A的直方图
sales['产品A'].plot(kind='hist', bins=15, title='产品A销售额分布', alpha=0.6)

# 4. 绘制产品A与产品B的散点图(查看相关性)
sales.plot(kind='scatter', x='产品A', y='产品B', title='产品A vs 产品B')

# 5. 绘制每日销售总量(各产品相加)的面积图
sales[['产品A', '产品B', '产品C']].sum(axis=1).plot(kind='area', title='每日总销售趋势', alpha=0.5)

plt.show()

⚠️ 注意事项

中文显示问题:如果图表中的中文显示为方框,需要设置 Matplotlib 的中文字体,例如 plt.rcParams['font.sans-serif'] = ['SimHei'] 并设置 plt.rcParams['axes.unicode_minus'] = False
依赖 matplotlib:Pandas 绘图实际调用 matplotlib,因此你可以结合使用 plt 进行更精细的控制,例如添加标签、调整图例等。
性能考虑:对于大数据集,绘制所有点可能导致性能下降,可以考虑采样或使用更高效的绘图库(如 plotly、seaborn)。
图形显示:在脚本中使用时需要调用 plt.show() 显示图形;在 Jupyter Notebook 中通常自动显示。
最佳实践:
  • 快速探索数据时,用 Pandas 内置绘图非常便捷;若需出版级图表,可结合 Matplotlib 或 Seaborn 进一步美化。
  • 绘制前先确保数据类型正确,尤其是日期索引。
  • 使用 figsize 控制图表大小,避免重叠。
  • 适当使用颜色、图例和标题,让图表自解释。