一、Pandas可视化基础原理
1.1 绘图引擎架构
Pandas的绘图系统基于Matplotlib构建,采用分层设计:
DataFrame.plot()
↳ pandas.plotting._core.PlotAccessor
↳ matplotlib.pyplot
当调用df.plot()
时,Pandas会自动完成以下转换:
- 将DataFrame结构解析为Matplotlib可识别的数据结构
- 根据kind参数选择对应的绘图方法(plt.plot/plt.bar等)
- 应用样式参数生成基础图表
- 返回Axes对象供进一步定制
1.2 核心参数解析矩阵
参数 | 适用图表类型 | 作用原理 | 示例值 |
---|---|---|---|
kind | 所有 | 指定图表类型编码 | ‘line’, ‘bar’ |
subplots | 多列数据 | 创建子图矩阵(mpl.subplots) | True/False |
layout | subplots=True时 | 控制子图排列方式 | (2,3) |
stacked | 柱状/面积图 | 控制堆叠模式 | True |
secondary_y | 双轴图 | 创建次Y轴坐标系 | True |
colormap | 多系列数据 | 应用颜色映射方案 | ‘viridis’, ‘jet’ |
二、六大核心图表深度解析
2.1 折线图(Line Plot)
数学原理:
折线图通过线性插值连接离散数据点,反映数据随时间或其他连续变量的变化趋势。其数学表达式为:
y=f(x)y = f(x)y=f(x)
其中xxx为自变量(通常为时间序列),yyy 为因变量。
应用场景:
- 时间序列分析(股票价格、温度变化)
- 多指标趋势对比(销售额 vs 成本)
- 周期性规律发现(月销量波动)
代码示例:
# 多指标折线图(带样式定制)
ax = df.plot(
kind='line',
x='Date',
y=['Revenue', 'Cost'],
style={
'Revenue': 'g--o', 'Cost': 'r-.s'}, # 分列定义线型
linewidth=2,
markersize=8,
title='营收与成本趋势对比',
figsize=(12, 6),
grid=True,
alpha=0.8,
subplots=False # 是否分拆为子图
)
# 添加辅助元素
ax.axvspan('2023-03-01', '2023-05-01', color='yellow', alpha=0.3) # 高亮区间
ax.annotate('峰值点',
xy=('2023-04-15', 9800),
xytext=('2023-05-01', 10000),
arrowprops=dict(facecolor='black', shrink=0.05))
plt.xticks(rotation=45) # X轴标签旋转
plt.tight_layout() # 自动调整布局
关键参数详解:
参数 | 类型 | 作用 |
---|---|---|
style |
dict | 定义每列数据的线型/标记(如 '-o' 表示实线+圆圈标记) |
linewidth |
float | 线条宽度(默认1.0) |
markersize |
int | 标记尺寸(默认6) |
alpha |
float | 透明度(0-1) |
subplots |
bool | 拆分多列为独立子图 |
2.2 柱状图(Bar Plot)
数学原理:
柱状图通过高度映射数值大小,适用于分类数据对比。其数学表达为:
高度=f(类别)\text{高度} = f(\text{类别})高度=f(类别)
应用场景:
- 分类数据对比(各城市销售额)
- 时间维度对比(月销量对比)
- 堆叠分析(产品类别销售构成)
代码示例:
# 堆叠柱状图(带数据标签)
ax = df.groupby('City')['Sales'].sum().plot(
kind='bar',
stacked=True,
color=['#4C72B0', '#DD8452', '#55A868'], # 自定义颜色
edgecolor='black',
width=0.8,
title='各城市销售额堆叠图',
rot=45
)
# 添加数值标签
for container in ax.containers:
ax.bar_label(container,
label_type='center', # 标签位置
fmt='%.0f', # 数字格式
color='white',
fontsize=10)
# 添加参考线
ax.axhline(y=50000, color='red', linestyle='--', linewidth=1)
ax.text(5.2, 51000, '目标线', color='red')
plt.xlabel('城市', fontsize=12)
plt.ylabel('销售额(万元)', fontsize=12)
进阶技巧:
- 横向柱状图:
kind='barh'
- 百分比堆叠:
stacked=True
+ 数据归一化 - 误差棒:
yerr
参数添加标准差