Pandas: 数据可视化
最后更新:2026-08-26
纯数字没人爱看——老板要的是图表,报告要的是图,PPT 要的是图。Pandas 的 df.plot 一行出图,背后是 Matplotlib 引擎。本节覆盖最常用的 8 种图表、子图布局和样式定制,让你快速把 DataFrame 变成可视化报告。
⚠️ 注意: 以下代码需在本地 Python 环境中运行,且需安装 matplotlib。
1. 你将学到
- ❶ df.plot 基础
- ❷ 各类图表(line/bar/hist/box/scatter/pie/area/kde)
- ❸ subplots 子图布局
- ❹ 样式定制
- ❺ 保存与导出
2. Bob 的销售可视化报告
(1) 痛点:表格没人看
Bob 给老板汇报月度销售,纯表格没人看。
(2) 解法:df.plot 一行出图
▶ 示例:df.plot 基础(难度⭐)
PYTHON
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Sample data
df = pd.DataFrame({
'month': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'],
'sales': [3200, 3500, 3800, 3600, 4100, 4500],
'cost': [2000, 2200, 2400, 2300, 2600, 2800]
})
df = df.set_index('month')
# Line chart — one line of code!
df['sales'].plot(kind='line', title='Monthly Sales Trend', figsize=(8, 4))
plt.ylabel('Sales ($)')
plt.tight_layout()
# plt.savefig('sales_trend.png', dpi=150)
# plt.show()
print("Line chart created!")
TEXT
📖 仅展示
> **输出:** 在本地 Python 环境(pandas 2.x)运行。Piston 服务器未预装 pandas,请在本机安装(`pip install pandas`)后实操对照。实际数值会因 pandas 版本略有差异。
3. 图表类型速查
(1) 8 种常用图表
| kind | 图表 | 适用场景 |
|---|---|---|
| line | 折线图 | 时间趋势 |
| bar | 柱状图 | 分类对比 |
| barh | 横向柱状图 | 长标签分类 |
| hist | 直方图 | 分布 |
| box | 箱线图 | 分布+异常值 |
| scatter | 散点图 | 相关性 |
| pie | 饼图 | 占比 |
| area | 面积图 | 累积趋势 |
| kde | 核密度 | 平滑分布 |
▶ 示例
TEXT
📖 仅展示
> **输出:** 在本地 Python 环境(pandas 2.x)运行。Piston 服务器未预装 pandas,请在本机安装(`pip install pandas`)后实操对照。实际数值会因 pandas 版本略有差异。
:多类图表(难度⭐⭐)
PYTHON
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42)
df = pd.DataFrame({
'category': ['Electronics', 'Clothing', 'Home', 'Sports', 'Books'],
'sales': [5000, 3000, 2000, 1500, 800],
'avg_price': [299, 55, 75, 45, 15],
'rating': [4.5, 4.2, 3.9, 4.0, 4.3]
})
# Bar chart — category comparison
df.plot(kind='bar', x='category', y='sales', title='Sales by Category', figsize=(8, 4))
# plt.show()
# Horizontal bar — better for long labels
df.plot(kind='barh', x='category', y='sales')
# plt.show()
# Pie chart — proportions
df.set_index('category')['sales'].plot(kind='pie', autopct='%1.1f%%', figsize=(6, 6))
# plt.show()
# Histogram — distribution
prices = pd.Series(np.random.normal(100, 30, 500))
prices.plot(kind='hist', bins=20, title='Price Distribution')
# plt.show()
# Box plot — distribution + outliers
scores = pd.DataFrame({
'Math': np.random.normal(75, 10, 100),
'English': np.random.normal(80, 12, 100),
'Science': np.random.normal(70, 15, 100)
})
scores.plot(kind='box', title='Score Distribution by Subject')
# plt.show()
# Scatter — correlation
df.plot(kind='scatter', x='avg_price', y='rating', title='Price vs Rating', s=100)
# plt.show()
TEXT
📖 仅展示
> **输出:** 在本地 Python 环境(pandas 2.x)运行。Piston 服务器未预装 pandas,请在本机安装(`pip install pandas`)后实操对照。实际数值会因 pandas 版本略有差异。
4. 子图布局
▶ 示例
TEXT
📖 仅展示
> **输出:** 在本地 Python 环境(pandas 2.x)运行。Piston 服务器未预装 pandas,请在本机安装(`pip install pandas`)后实操对照。实际数值会因 pandas 版本略有差异。
:subplots 多图布局(难度⭐⭐)
PYTHON
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42)
df = pd.DataFrame({
'A': np.random.randn(50).cumsum(),
'B': np.random.randn(50).cumsum(),
'C': np.random.randn(50).cumsum(),
'D': np.random.randn(50).cumsum()
})
# Each column in its own subplot
df.plot(subplots=True, layout=(2, 2), figsize=(10, 8), sharey=True)
plt.suptitle('4 Series Trend')
plt.tight_layout()
# plt.show()
# Custom layout
df[['A', 'B']].plot(subplots=True, layout=(1, 2), figsize=(12, 4))
# plt.show()
TEXT
📖 仅展示
> **输出:** 在本地 Python 环境(pandas 2.x)运行。Piston 服务器未预装 pandas,请在本机安装(`pip install pandas`)后实操对照。实际数值会因 pandas 版本略有差异。
5. 样式定制
▶ 示例
TEXT
📖 仅展示
> **输出:** 在本地 Python 环境(pandas 2.x)运行。Piston 服务器未预装 pandas,请在本机安装(`pip install pandas`)后实操对照。实际数值会因 pandas 版本略有差异。
:样式定制(难度⭐⭐)
PYTHON
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42)
df = pd.DataFrame({
'sales': np.random.randint(100, 500, 12),
'profit': np.random.randint(10, 150, 12)
}, index=pd.date_range('2024-01', periods=12, freq='MS').strftime('%b'))
# Custom colors, markers, line style
ax = df.plot(
kind='line',
style=['o-', 's--'], # markers + line style
color=['#2196F3', '#FF5722'], # custom colors
figsize=(10, 5),
title='Monthly Sales & Profit',
xlabel='Month',
ylabel='Amount ($)',
grid=True,
alpha=0.8
)
# Add annotations
ax.axhline(y=df['sales'].mean(), color='gray', linestyle=':', label='Avg Sales')
ax.legend(loc='upper left')
plt.tight_layout()
# plt.show()
print("Styled chart created!")
TEXT
📖 仅展示
> **输出:** 在本地 Python 环境(pandas 2.x)运行。Piston 服务器未预装 pandas,请在本机安装(`pip install pandas`)后实操对照。实际数值会因 pandas 版本略有差异。
6. Pandas vs Matplotlib
| 特性 | df.plot | Matplotlib |
|---|---|---|
| 代码量 | 1 行 | 5-15 行 |
| 灵活性 | 中 | 高 |
| 学习曲线 | 低 | 高 |
| 定制 | 基础 | 无限 |
| 关系 | 封装 Matplotlib | 底层引擎 |
💡 提示: df.plot 返回 Matplotlib Axes 对象,可以用 Matplotlib 方法继续精调。策略:df.plot 快速出图 → Axes 精调细节。
7. 完整示例:电商销售可视化报告
(4) ▶ 图表选择决策树
graph TB
A[要展示什么?] --> B{趋势变化?}
B -->|是| C[折线图 line]
B -->|否| D{分类对比?}
D -->|是| E[柱状图 bar]
D -->|否| F{数据分布?}
F -->|是| G[直方图 hist / 箱线图 box]
F -->|否| H{相关性?}
H -->|是| I[散点图 scatter]
H -->|否| J{占比?}
J -->|是| K[饼图 pie]
J -->|否| L[面积图 area]
TEXT
📖 仅展示
> **输出:** 在本地 Python 环境(pandas 2.x)运行。Piston 服务器未预装 pandas,请在本机安装(`pip install pandas`)后实操对照。实际数值会因 pandas 版本略有差异。
▶ 示例
TEXT
📖 仅展示
> **输出:** 在本地 Python 环境(pandas 2.x)运行。Piston 服务器未预装 pandas,请在本机安装(`pip install pandas`)后实操对照。实际数值会因 pandas 版本略有差异。
:可视化报告全流程(难度⭐⭐⭐)
PYTHON
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# ============================================
# Comprehensive example: E-commerce sales
# visualization report with multiple charts
# ============================================
np.random.seed(42)
df = pd.DataFrame({
'month': pd.date_range('2024-01', periods=12, freq='MS'),
'Electronics': np.random.randint(3000, 8000, 12),
'Clothing': np.random.randint(1000, 4000, 12),
'Home': np.random.randint(500, 2500, 12),
'Sports': np.random.randint(300, 1500, 12)
})
df = df.set_index('month')
# 1. Line: monthly trend
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
df.plot(ax=axes[0, 0], kind='line', title='Monthly Sales by Category')
axes[0, 0].set_ylabel('Sales ($)')
# 2. Bar: total by category
df.sum().plot(ax=axes[0, 1], kind='bar', title='Annual Sales by Category', color='steelblue')
axes[0, 1].set_ylabel('Total Sales ($)')
# 3. Pie: market share
df.sum().plot(ax=axes[1, 0], kind='pie', autopct='%1.1f%%', title='Market Share')
# 4. Area: cumulative trend
df.plot(ax=axes[1, 1], kind='area', alpha=0.5, title='Cumulative Sales Trend')
axes[1, 1].set_ylabel('Sales ($)')
plt.suptitle('2024 E-Commerce Sales Report', fontsize=16)
plt.tight_layout()
# plt.savefig('sales_report.png', dpi=150, bbox_inches='tight')
print("4-chart report created!")
TEXT
📖 仅展示
> **输出:** 在本地 Python 环境(pandas 2.x)运行。Piston 服务器未预装 pandas,请在本机安装(`pip install pandas`)后实操对照。实际数值会因 pandas 版本略有差异。
❓ 常见问题
Q Pandas plot 和 Matplotlib 关系?
A df.plot 是 Matplotlib 的高级封装——底层调 matplotlib.pyplot 绘图,返回 Axes 对象。简单图表用 df.plot(1行搞定),复杂定制用 Matplotlib(先 df.plot 出基础图,再用 Axes 方法精调)。两者无缝衔接。
Q kind 参数有哪些?
A line(折线/默认)、bar(柱状)、barh(横向柱状)、hist(直方图)、box(箱线图)、kde/density(核密度)、area(面积图)、pie(饼图)、scatter(散点图)、hexbin(六边形图)。最常用:line/bar/hist/scatter。
Q subplots 怎么布局?
A subplots=True 每列一个子图,layout=(rows, cols) 指定网格。如 layout=(2,2) 是 2×2 网格。sharex/sharey=True 共享坐标轴。也可以手动:
fig, axes = plt.subplots(2,2) 再 df.plot(ax=axes[0,0]) 指定位置。Q 如何保存图片?
A
plt.savefig('filename.png', dpi=150, bbox_inches='tight')。dpi 控制分辨率(150=中等,300=高清)。bbox_inches='tight' 避免标签被裁剪。支持 png/jpg/svg/pdf 格式。保存前不要 plt.show()(show 后图像被清除)。Q 中文乱码怎么办?
A 两种方案:①
plt.rcParams['font.sans-serif'] = ['SimHei'] 设置中文字体(Windows);② 标题和标签用英文(推荐,避免字体兼容问题)。方案 ② 更通用——跨平台不依赖字体文件。Q scatter 怎么加颜色映射?
A 用 c 参数指定颜色列:
df.plot(kind='scatter', x='price', y='rating', c='sales', cmap='viridis', colorbar=True)。cmap 指定色彩映射(viridis/coolwarm/RdYlGn),colorbar 显示图例。s 参数控制点大小。Q 如何在已有图上叠加?
A 用 ax 参数:
ax1 = df1.plot() 然后 df2.plot(ax=ax1)。第二次 plot 会叠加在第一次的图上,共享坐标轴。适合对比多组数据。设置 label 和 legend 区分。📖 小节
- df.plot(kind=...) 一行出图,底层是 Matplotlib
- 8 种图表:line(趋势)/bar(对比)/hist(分布)/box(分布+异常)/scatter(相关)/pie(占比)/area(累积)/kde(密度)
- subplots=True 多子图,layout=(r,c) 网格布局
- 样式定制:style/color/figsize/title/grid/alpha/axhline
- df.plot 返回 Axes 对象,可用 Matplotlib 继续精调
- 保存:plt.savefig(path, dpi, bbox_inches)
- 策略:df.plot 快速出图 → Matplotlib 精调细节
📝 作业
- 基础题(难度⭐):创建月度销售 DataFrame,用 line/bar/pie 三种图表展示,对比不同图表的效果。
- 进阶题(难度⭐⭐):创建多列 DataFrame,用 subplots=True 画 2×2 子图(line/bar/box/hist),添加标题和网格。
- 挑战题(难度⭐⭐⭐):模拟 12 个月×4 品类的销售数据,创建 4 图报告:趋势线图+年度柱状图+占比饼图+价格-评分散点图,保存为 PNG。