5-2 分析特征关系常用图形

🎯 教学目标与重难点…

【三维目标】

  • 📚 知识目标:掌握散点图(Scatter Plot)和折线图(Line Plot)的绘制原理及应用场景;理解相关性与趋势变化的可视化表达。
  • ⚙️ 能力目标:能够熟练使用 ax.scatter()ax.plot(),根据数据特征调整颜色、大小、透明度及标记样式,进行多维关系表达。
  • 💡 素养目标:培养通过图表挖掘变量间潜在规律的敏感度,树立“用数据说话、用图形揭示规律”的科学探索精神。

【重点与难点】

  • 🟢 教学重点:散点图(相关性分析)与折线图(趋势分析)的选型;透明度(alpha)、映射颜色(c)与尺寸(s)的多维展示。
  • 🟡 教学难点:散点图中气泡图(多维数据)的映射技巧;折线图中的数据排序与连续趋势呈现。

📌 一、 课程导入(5分钟)

给出两组实际业务数据:

  1. 某电商平台用户的“浏览时长”与“消费金额”;
  2. 某公司近 12 个月的“月度营业额”。 提问:如果想分别看“两者之间是否存在关联”以及“随着时间推移变化趋势如何”,应该选择什么图形?引出特征关系分析两大核心图形:散点图与折线图。
  • 👨‍🏫 教师活动:展示数据表格,引导学生对比“相关关系”与“时间趋势”的区别。
  • 🧑‍🎓 学生活动:结合直觉回答,讨论散点和折线在表达意义上的不同。

通过真实业务问题驱动,明确不同图表的功能定位,培养针对不同数据关系选择合适图表的能力。


📖 二、 解决问题过程(一):5.2.1 散点图与多维特征映射

  1. 散点图应用场景:展示两个连续变量之间的相关关系(正相关、负相关、不相关、非线性关系)。
  2. 多维扩展(气泡图)
  • $X$ 轴与 $Y$ 轴:表达前两个变量。
  • 点的大小(s):表达第三个数值变量。
  • 点的颜色(c):表达第四个数值或类别变量。
  • 透明度(alpha):缓解数据点重叠(Overplotting)现象。
  • 👨‍🏫 教师活动:讲解 ax.scatter() 参数,重点演示 cmap(颜色映射)与 alpha 在重叠数据上的作用。
  • 🧑‍🎓 学生活动:尝试调整点的大小与透明度,观察不同颜色映射(如 viridisplasma)的效果。

让学生掌握从二维散点图向三维/四维“气泡图”拓展的高级可视化技巧。


💻 三、 解决问题过程(二):5.2.2 折线图与趋势分析代码实践

  1. 折线图应用场景:展示数据随连续变量(常为时间)的变化趋势。
  2. 注意事项:折线图的 $X$ 轴通常需要经过排序,否则会导致线条杂乱折叠。
  3. 综合案例:在一张图中同时呈现数据散点(观测值)与趋势折线(拟合/均值趋势)。
 1import matplotlib.pyplot as plt
 2import numpy as np
 3
 4# 1. 基础设置
 5plt.rcParams['font.sans-serif'] = ['SimHei']
 6plt.rcParams['axes.unicode_minus'] = False
 7
 8# 2. 生成模拟数据:房屋面积与价格(带随机噪声)
 9np.random.seed(42)
10area = np.random.uniform(50, 200, 50)               # 房屋面积 (m²)
11price = area * 3.5 + np.random.normal(0, 50, 50)    # 房屋价格 (万元)
12age = np.random.randint(1, 30, 50)                  # 房龄 (年)
13
14# 排序以便画趋势线
15sort_idx = np.argsort(area)
16area_sorted = area[sort_idx]
17price_trend = area_sorted * 3.5
18
19# 3. 面向对象绘图
20fig, ax = plt.subplots(figsize=(9, 5))
21
22# 绘制散点(气泡图:大小表示房龄,颜色表示价格高低)
23scatter = ax.scatter(area, price, c=price, s=age*10, cmap='viridis', alpha=0.7, edgecolors='gray', label='房屋样例')
24
25# 绘制趋势折线
26ax.plot(area_sorted, price_trend, color='red', linestyle='--', linewidth=2, label='基准价格线')
27
28# 添加颜色条 (Colorbar)
29cbar = fig.colorbar(scatter, ax=ax)
30cbar.set_label('总价区间 (万元)')
31
32ax.set_title("房屋面积与总价关系分析(点大小代表房龄)", fontsize=14)
33ax.set_xlabel("房屋面积 (m²)", fontsize=12)
34ax.set_ylabel("总价格 (万元)", fontsize=12)
35ax.legend(loc='upper left')
36ax.grid(True, alpha=0.3)
37
38plt.show()
  • 👨‍🏫 教师活动:在代码中故意不给 $X$ 轴数据排序画折线,让学生观察“蜘蛛网”现象,强调排序重要性。
  • 🧑‍🎓 学生活动:排查问题并修正代码,体会散点图与折线图结合表达数据的优势。

通过实际业务场景(房价预测),结合散点与折线,深化对特征关系理解与绘图实操。


✍️ 四、 解决问题过程(三):课堂练习与巩固

📝 任务一:股票月度收益率与波动趋势绘制…

背景与题目: 已知某股票 12 个月的交易数据,包含月份、收益率(%)以及交易量(万手)。

  • 请绘制折线图展现 12 个月的收益率趋势,并在转折点添加标记(marker='o');
  • 使用虚线绘制收益率的 0% 参考线(ax.axhline(0, ...));
  • 当收益率大于 0 时,折线上的点填充颜色为红色;小于 0 时填充颜色为绿色。
🔍 查看参考代码与解析…
 1import matplotlib.pyplot as plt
 2import numpy as np
 3
 4plt.rcParams['font.sans-serif'] = ['SimHei']
 5plt.rcParams['axes.unicode_minus'] = False
 6
 7months = [f"{i}月" for i in range(1, 13)]
 8returns = np.array([2.5, 4.1, -1.8, -3.2, 0.5, 5.2, 3.8, -0.9, 1.2, 6.0, -2.1, 3.0])
 9
10fig, ax = plt.subplots(figsize=(9, 4.5))
11
12# 绘制基础折线
13ax.plot(months, returns, color='gray', linestyle='-', linewidth=1.5, zorder=1)
14
15# 根据正负绘制不同颜色的点
16pos_mask = returns >= 0
17neg_mask = returns < 0
18
19ax.scatter(np.array(months)[pos_mask], returns[pos_mask], color='red', s=60, zorder=2, label='盈利月份')
20ax.scatter(np.array(months)[neg_mask], returns[neg_mask], color='green', s=60, zorder=2, label='亏损月份')
21
22# 0 收益基准线
23ax.axhline(0, color='black', linestyle='--', linewidth=1, alpha=0.7)
24
25ax.set_title("某股票年度月度收益率变化趋势", fontsize=14)
26ax.set_xlabel("月份")
27ax.set_ylabel("收益率 (%)")
28ax.legend()
29ax.grid(True, alpha=0.3)
30
31plt.show()

📝 五、 课堂小结(5 分钟)

flowchart LR
    root["📊 5.2 分析特征关系图形"]

    subgraph C1["🔵 散点图 (Scatter)"]
        direction TB
        A1["适用:两连续变量相关性"]
        A2["扩展:c (颜色), s (大小/气泡)"]
        A3["优化:alpha 透明度去重叠"]
    end

    subgraph C2["📈 折线图 (Line)"]
        direction TB
        B1["适用:时间序列/连续趋势"]
        B2["关键:X 轴数据必须有序"]
        B3["样式:linestyle, marker"]
    end

    subgraph C3["🤝 组合运用"]
        direction TB
        C1_node["散点看分布/离群值"]
        C2_node["折线看总体拟合趋势"]
    end

    root --> C1
    root --> C2
    root --> C3

    style root fill:#4b6cb7,stroke:#253b6e,color:#fff,stroke-width:2px,rx:8px,ry:8px
    style C1 fill:#e3f2fd,stroke:#2196f3,stroke-width:1px
    style C2 fill:#fff3e0,stroke:#ff9800,stroke-width:1px
    style C3 fill:#e8f5e9,stroke:#4caf50,stroke-width:1px

✏️ 随堂检测与互动练习

点击展开:随堂测试题(带解析)

一、 单选题

  1. 当我们需要观察产品“价格”与“销量”之间是否存在负相关关系时,最合适的图表类型是?
  • A. 折线图
  • B. 饼图
  • C. 散点图
  • D. 箱线图
【答案】

【解析】C。散点图专用于探索和展示两个连续变量之间的关联模式(如正相关、负相关等)。

  1. 在 Matplotlib 的 ax.scatter(x, y, s=100, c=colors) 函数中,参数 sc 分别控制什么?
  • A. 形状(Shape)和颜色(Color)
  • B. 点的大小(Size)和颜色(Color)
  • C. 线的粗细(Stroke)和透明度(Clearity)
  • D. 影子的位置(Shadow)和颜色(Color)
【答案】

【解析】Bs 代表 size(散点大小),c 代表 color(颜色/颜色数组)。

二、 代码填空题

题目:补充代码,在折线图中画一条 $y=0$ 的水平虚线辅助线:

1# 添加 y=0 的黑色虚线参考线,透明度设置为 0.5
2ax.___________________(0, color='black', linestyle='--', alpha=0.5)
【答案】

axhline


📮 六、 课后作业与拓展

📮 课后作业…
  1. 使用 Seaborn 或 Scikit-Learn 内置的 Iris(鸢尾花)数据集,选择“花萼长度”与“花萼宽度”绘制散点图,用不同颜色区分三个品种。
  2. 查找近 10 年全球气温变化数据,绘制气温变化的折线图,并用 ax.axhline() 标出 10 年平均气温线。
  3. 思考并实践:当散点图上的点密度极高严重重叠时,除了调整 alpha 外,还可以用什么图表解决?(提示:二维直方图或 hexbin 六边形图)。
  4. 编写代码尝试在折线图的最高点和最低点自动标注文本(提示:使用 ax.annotate())。
  5. 探索 ax.plot()drawstyle 参数(如 steps-post),尝试绘制阶梯折线图。

📋 七、 板书设计

🛠️ 板书设计…
 1=======================================================================
 2               5.2 分析特征关系常用图形
 3=======================================================================
 41. 散点图 (ax.scatter):
 5   - 目的: 相关性分析 (X 与 Y)
 6   - 维度扩展:
 7     * s (size): 第 3 维度
 8     * c (color): 第 4 维度
 9     * alpha: 解决数据重叠
10
112. 折线图 (ax.plot):
12   - 目的: 趋势分析 (Time/Sequence)
13   - 关键要素: X轴保持递增排序,线条+标记结合 (marker='o')
14=======================================================================