Matplotlib高级图表:热力图与箱线图¶

教学目标¶

面向大一文科生讲解Matplotlib中的高级图表绘制方法,重点介绍热力图和箱线图的概念、应用场景及实现方法,结合人文社科领域的实际案例。

1. 热力图 (Heatmap)¶

1.1 定义与适用场景¶

定义:热力图是通过颜色变化来显示矩阵数据的二维图表,用颜色深浅表示数值大小。

应用场景:

  • 社会科学:不同地区多项指标对比
  • 经济学:相关系数矩阵可视化
  • 心理学:问卷量表各维度相关性
  • 教育学:学生各科成绩关联分析

1.2 基础热力图绘制¶

In [2]:
import numpy as np
import matplotlib.pyplot as plt
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 创建模拟数据:5个城市4项人文指标评分
cities = ['北京', '上海', '广州', '成都', '武汉']
indicators = ['文化设施', '教育投入', '文化遗产', '阅读指数']
data = np.random.randint(50, 95, size=(5, 4))  # 5城市×4指标
# 绘制基础热力图
plt.figure(figsize=(10, 6))
heatmap = plt.imshow(data, cmap='YlOrRd')  # 使用黄-橙-红色系
# 添加坐标轴标签
plt.xticks(np.arange(len(indicators)), indicators)
plt.yticks(np.arange(len(cities)), cities)
# 添加颜色条
plt.colorbar(heatmap, label='评分值')
# 添加标题
plt.title('五大城市人文发展指标热力图', pad=20)
 
# 显示图表
plt.show()

1.3 进阶热力图(带数值标注)¶

In [3]:
plt.figure(figsize=(10, 6))
heatmap = plt.imshow(data, cmap='Blues')  # 更换为蓝色系

# 添加数值标注
for i in range(len(cities)):
    for j in range(len(indicators)):
        plt.text(j, i, f'{data[i,j]}',
                 ha='center', va='center',
                 color='w' if data[i,j] > 70 else 'k')  # 根据背景色调整文字颜色

#当数据值 data[i,j] > 70 时,文字颜色设为白色(w),否则设为黑色(k)。
#目的:通过黑白对比度适应不同背景色。例如,深色背景(如热力图中高值区域)适合白色文字,浅色背景(低值区域)适合黑色文字。

# 美化设置
plt.xticks(np.arange(len(indicators)), indicators, rotation=45)
plt.yticks(np.arange(len(cities)), cities)
plt.colorbar(heatmap, label='评分值')
plt.title('五大城市人文发展指标热力图(带数值标注)', pad=20)
plt.tight_layout()
plt.show()

1.4 人文社科案例练习¶

任务:分析不同省份文化产业各维度发展水平

In [4]:
provinces = ['江苏', '浙江', '广东']
dimensions = ['出版业', '影视制作', '艺术表演', '文化场馆', '数字创意']
culture_data = np.array([
    [85, 78, 82, 88, 76],
    [82, 85, 79, 83, 81],
    [78, 76, 85, 79, 84]
])

plt.figure(figsize=(10, 6))
plt.imshow(culture_data, cmap='viridis')
plt.xticks(np.arange(len(dimensions)), dimensions)
plt.yticks(np.arange(len(provinces)), provinces)
plt.colorbar(label='评分')
plt.title('不同省份文化产业发展水平')
plt.grid(False)
plt.show()

2. 箱线图 (Boxplot)¶

2.1 定义与适用场景¶

定义:箱线图又称盒须图,能够显示一组数据的分布情况,包括中位数、四分位数和异常值。

应用场景:

  • 社会学:不同收入群体的消费水平比较

  • 教育学:不同班级成绩分布对比

  • 心理学:实验组与控制组的反应时分析

  • 经济学:各地区房价分布研究

2.2 基础箱线图绘制¶

In [2]:
import numpy as np
import matplotlib.pyplot as plt
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

method1 = np.random.normal(75, 8, 50)
method2 = np.random.normal(85, 6, 50)
method3 = np.random.normal(70, 10, 50)
data = [method1, method2, method3]
labels = ['传统教学', '混合教学', '在线教学']

plt.figure(figsize=(10, 6))
box = plt.boxplot(data, labels=labels, patch_artist=True)

colors = ['#FF9999', '#66B2FF', '#99FF99']
for patch, color in zip(box['boxes'], colors):
    patch.set_facecolor(color)

plt.title('不同教学方法效果对比', fontsize=16)
plt.ylabel('测试成绩', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.4)

plt.show()

2.3 箱线图元素解析¶

  • 中位数:箱体中间的线

  • 四分位距(IQR):箱体范围(Q1到Q3)

  • 须线:通常为1.5倍IQR范围

  • 异常值:超出须线的数据点

2.4 人文社科案例练习¶

任务:比较不同年龄段社交媒体使用时长

In [6]:
age_20s = np.random.normal(120, 30, 100)
age_30s = np.random.normal(90, 25, 100)
age_40s = np.random.normal(60, 20, 100)
age_50s = np.random.normal(40, 15, 100)

data = [age_20s, age_30s, age_40s, age_50s]
labels = ['20岁', '30岁', '40岁', '50岁']

plt.figure(figsize=(10, 6))
plt.boxplot(data, labels=labels, patch_artist=True, showmeans=True)
plt.title('不同年龄段社交媒体使用时长对比')
plt.ylabel('每日使用时长(分钟)')
plt.grid(axis='y', linestyle='--', alpha=0.3)

plt.show()

3. 综合练习与作业¶

请根据上述示例自行完成热力图和箱线图综合练习。

In [ ]:
### 3.1 热力图实践
任务要求:

- 分析各省文化产业指标相关性

- 使用coolwarm色系

- 标注显著性标记(p<0.05)

实现步骤:

- 计算相关系数矩阵

- 设置vmin=-1, vmax=1

- 添加星号标注

3.2 箱线图实践¶

分组比较案例:

  • 不同学历人群阅读量分布

  • 城乡消费水平对比

附录:常用参数参考¶

热力图关键参数¶

参数 说明 示例值
cmap 颜色映射 'viridis', 'plasma', 'YlOrRd'
vmin/vmax 值范围 vmin=0, vmax=100
annot 显示数值 annot=True
fmt 数值格式 fmt='.1f'
linewidths 单元格边线 linewidths=0.5

箱线图关键参数¶

参数 说明 示例值
positions 箱体位置 [1,2,4,5]
widths 箱体宽度 widths=0.6
showmeans 显示均值 showmeans=True
meanline 均值线样式 meanline=True
notch 显示置信区间 notch=True

通过本课程的学习,希望同学们能够掌握这两种高级图表的绘制方法,在人文社科研究中更全面地展示和分析数据特征。

In [ ]: