首页 > Pandas数据分析实战训练营 > 项目8 数据可视化(Matplotlib/Seaborn)

项目8 数据可视化(Matplotlib/Seaborn)

学习目标

  • 理解数据可视化的作用和选择图表的原则
  • 掌握 pandas 内置的 .plot() 快速绘图
  • 学会用 Matplotlib 绘制折线图、柱状图、饼图、散点图
  • 学会用 Seaborn 绘制热力图、箱线图
  • 能够根据数据类型选择合适的图表
  • 掌握图表美化的基本技巧

知识点讲解

1. 为什么要做数据可视化?

人脑处理图像的速度比处理文字快 6 万倍。一张好的图表,能让老板在 3 秒内看懂数据趋势。做数据分析,最后一步通常就是把结果"画"出来。

2. 如何选择合适的图表?

  • 折线图:看趋势变化(销售额随时间变化)
  • 柱状图:比较不同类别的数值(各品类销售额对比)
  • 饼图:看占比构成(各品类销售占比)
  • 散点图:看两个变量的关系(价格 vs 销量)
  • 热力图:看矩阵数据的密度(各地区各月份销售额)
  • 箱线图:看数据分布和异常值

3. pandas 快速绘图

pandas 的 Series 和 DataFrame 都有 .plot() 方法,底层调用的是 Matplotlib,适合快速出图。

# Series 直接画折线图 df['销售额'].plot() # DataFrame 画多线图 df.plot(x='月份', y=['销售额', '利润'])

4. Matplotlib 精细控制

Matplotlib 是 Python 最基础的绘图库,可以精确控制图表的每一个元素:标题、坐标轴、颜色、图例等。

import matplotlib.pyplot as plt plt.figure(figsize=(10, 5)) plt.plot(x, y, label='销售额') plt.title('月度销售额趋势') plt.xlabel('月份') plt.ylabel('金额(元)') plt.legend() plt.show()

5. Seaborn 统计图表

Seaborn 基于 Matplotlib,专门做统计可视化,代码更简洁,默认样式更美观。

import seaborn as sns sns.heatmap(data, annot=True, fmt='.0f', cmap='YlOrRd') sns.boxplot(x='品类', y='销售额', data=df)

完整代码示例

import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns # 设置中文字体(Windows) plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei'] plt.rcParams['axes.unicode_minus'] = False # ========== 1. 创建模拟数据 ========== np.random.seed(42) # 月度销售数据 months = ['1月', '2月', '3月', '4月', '5月', '6月'] sales = [120, 135, 148, 162, 155, 178] profit = [25, 30, 35, 40, 38, 45] # 品类销售数据 categories = ['食品', '饮料', '日用品', '家电', '服装'] cat_sales = [320, 210, 180, 450, 290] # 详细订单数据(用于散点图和箱线图) n = 200 df = pd.DataFrame({ '品类': np.random.choice(categories, n), '销售额': np.random.randint(50, 2000, n), '数量': np.random.randint(1, 20, n), '客户评分': np.random.randint(1, 6, n) }) # 热力图数据:地区 × 月份 regions = ['华东', '华南', '华北', '西南'] heatmap_data = np.random.randint(50, 300, size=(4, 6)) heatmap_df = pd.DataFrame(heatmap_data, index=regions, columns=months) # ========== 2. 折线图:月度销售趋势 ========== plt.figure(figsize=(10, 5)) plt.plot(months, sales, marker='o', linewidth=2, label='销售额', color='#2563eb') plt.plot(months, profit, marker='s', linewidth=2, label='利润', color='#16a34a') plt.title('2024年上半年销售额与利润趋势', fontsize=14, fontweight='bold') plt.xlabel('月份') plt.ylabel('金额(万元)') plt.legend() plt.grid(True, alpha=0.3) plt.tight_layout() plt.show() # ========== 3. 柱状图:品类销售额对比 ========== plt.figure(figsize=(10, 5)) colors = ['#2563eb', '#0ea5e9', '#8b5cf6', '#f59e0b', '#ef4444'] bars = plt.bar(categories, cat_sales, color=colors, edgecolor='white') plt.title('各品类销售额对比', fontsize=14, fontweight='bold') plt.xlabel('品类') plt.ylabel('销售额(万元)') # 在柱子上标注数值 for bar, val in zip(bars, cat_sales): plt.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 5, str(val), ha='center', va='bottom', fontweight='bold') plt.tight_layout() plt.show() # ========== 4. 饼图:品类销售占比 ========== plt.figure(figsize=(8, 8)) plt.pie(cat_sales, labels=categories, autopct='%1.1f%%', colors=colors, startangle=90, explode=(0.05, 0, 0, 0.05, 0)) plt.title('各品类销售占比', fontsize=14, fontweight='bold') plt.show() # ========== 5. 散点图:数量 vs 销售额 ========== plt.figure(figsize=(10, 6)) for i, cat in enumerate(categories): mask = df['品类'] == cat plt.scatter(df[mask]['数量'], df[mask]['销售额'], label=cat, alpha=0.6, s=50, color=colors[i]) plt.title('订单数量与销售额关系', fontsize=14, fontweight='bold') plt.xlabel('数量') plt.ylabel('销售额(元)') plt.legend() plt.grid(True, alpha=0.3) plt.tight_layout() plt.show() # ========== 6. 热力图:地区 × 月份 ========== plt.figure(figsize=(10, 6)) sns.heatmap(heatmap_df, annot=True, fmt='d', cmap='YlOrRd', linewidths=0.5, cbar_kws={'label': '销售额(万元)'}) plt.title('各地区月度销售额热力图', fontsize=14, fontweight='bold') plt.tight_layout() plt.show() # ========== 7. 箱线图:各品类销售额分布 ========== plt.figure(figsize=(10, 6)) sns.boxplot(x='品类', y='销售额', data=df, palette='Set2') plt.title('各品类销售额分布(箱线图)', fontsize=14, fontweight='bold') plt.ylabel('销售额(元)') plt.tight_layout() plt.show() # ========== 8. pandas 内置 plot 快速绘图 ========== print("\n【pandas 快速绘图示例】") # 折线图 df_ts = pd.DataFrame({'月份': months, '销售额': sales, '利润': profit}) df_ts.set_index('月份')['销售额'].plot(kind='line', marker='o', title='pandas快速折线图') plt.show() # 柱状图 df_ts.set_index('月份')['销售额'].plot(kind='bar', color='#2563eb', title='pandas快速柱状图') plt.show() # ========== 9. 组合图:柱状图 + 折线图 ========== fig, ax1 = plt.subplots(figsize=(10, 5)) ax1.bar(months, sales, color='#2563eb', alpha=0.7, label='销售额') ax1.set_ylabel('销售额(万元)', color='#2563eb') ax2 = ax1.twinx() ax2.plot(months, [s/p*100 for s, p in zip(sales, profit)], color='#ef4444', marker='o', linewidth=2, label='利润率(%)') ax2.set_ylabel('利润率(%)', color='#ef4444') plt.title('销售额与利润率组合图', fontsize=14, fontweight='bold') fig.legend(loc='upper left') plt.tight_layout() plt.show()

实操步骤

步骤1:新建 Notebook,导入 pandas、numpy、matplotlib.pyplot、seaborn。

步骤2:设置中文字体,解决中文乱码问题(根据系统选择 SimHei 或 Microsoft YaHei)。

步骤3:运行折线图代码,观察销售额和利润的趋势变化。

步骤4:运行柱状图代码,对比各品类的销售额,尝试修改颜色。

步骤5:运行饼图代码,观察各品类的占比,尝试调整 explode 参数突出显示某个品类。

步骤6:运行散点图代码,分析数量和销售额之间的关系。

步骤7:运行热力图代码,观察哪个地区哪个月份销售额最高。

步骤8:运行箱线图代码,找出哪个品类的销售额波动最大、异常值最多。

步骤9:尝试用 pandas 的 .plot() 方法快速画折线图和柱状图,对比 Matplotlib 的写法。

项目8 配套练习
0/7
第1题 选择题
想要展示销售额随时间的变化趋势,应该选择哪种图表?
A. 饼图
B. 折线图
C. 散点图
D. 热力图
答案解析

折线图最适合展示数据随时间变化的趋势。

第2题 选择题
想要比较不同品类的销售额大小,最适合用哪种图表?
A. 折线图
B. 柱状图
C. 饼图
D. 箱线图
答案解析

柱状图通过柱子高度直观比较不同类别的数值大小。

第3题 选择题
想要看各品类销售额占总销售额的比例,应该用哪种图表?
A. 散点图
B. 热力图
C. 饼图
D. 箱线图
答案解析

饼图专门用于展示各部分占总体的比例关系。

第4题 选择题
Seaborn 的 sns.heatmap() 最适合展示什么类型的数据?
A. 单一变量的时间趋势
B. 两个分类变量交叉的数值矩阵
C. 数据的分布形状
D. 变量间的相关关系
答案解析

热力图用颜色深浅展示矩阵中每个单元格的数值大小,适合两个分类变量交叉的数据。

第5题 判断题
pandas 的 Series 和 DataFrame 可以直接调用 .plot() 方法画图。
正确
错误
答案解析

pandas 内置了 plot 方法,底层调用 Matplotlib,适合快速出图。

第6题 填空题
Matplotlib 中,plt.rcParams['font.sans-serif'] 的作用是设置 ______ 。
答案解析

设置中文字体可以解决图表中中文显示为方框的问题。

第7题 判断题
箱线图可以直观地看出数据的中位数、四分位数和异常值。
正确
错误
答案解析

箱线图中间的线是中位数,箱子上下边缘是四分位数,箱子外的点是异常值。

0/7

项目小结

本项目我们学习了数据可视化的核心技能:

  • 选图原则:趋势用折线、比较用柱状、占比用饼图、关系用散点、矩阵用热力图、分布用箱线。
  • pandas 快速绘图:.plot() 一行代码出图,适合探索性分析。
  • Matplotlib 精细控制:可以控制标题、坐标轴、颜色、图例等每一个细节。
  • Seaborn 统计图表:热力图、箱线图等统计图表代码更简洁,样式更美观。
  • 中文显示:记得设置中文字体,否则中文会变成方框。
  • 组合图:可以用 twinx() 把柱状图和折线图画在一起,展示双轴数据。

记住:图表不是越多越好,一张清晰、准确的图表胜过十张花哨的图表。选择合适的图表类型,才能让数据"说话"!

← 上一项目:时间序列数据处理 下一项目:综合实战:销售数据分析报告 →