Pandas: 数据可视化

最后更新:2026-08-26

纯数字没人爱看——老板要的是图表,报告要的是图,PPT 要的是图。Pandas 的 df.plot 一行出图,背后是 Matplotlib 引擎。本节覆盖最常用的 8 种图表、子图布局和样式定制,让你快速把 DataFrame 变成可视化报告。

⚠️ 注意: 以下代码需在本地 Python 环境中运行,且需安装 matplotlib。

1. 你将学到


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) ▶ 图表选择决策树

100%
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 区分。

📖 小节


📝 作业

  1. 基础题(难度⭐):创建月度销售 DataFrame,用 line/bar/pie 三种图表展示,对比不同图表的效果。
  2. 进阶题(难度⭐⭐):创建多列 DataFrame,用 subplots=True 画 2×2 子图(line/bar/box/hist),添加标题和网格。
  3. 挑战题(难度⭐⭐⭐):模拟 12 个月×4 品类的销售数据,创建 4 图报告:趋势线图+年度柱状图+占比饼图+价格-评分散点图,保存为 PNG。

← 上一课:窗口计算 · 下一课:性能优化 →

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏