Lab 2.2 高效学习Matplotlib绘图实验

(date: 2025-11-24)

需改写

通过这个90分钟的实验,你可以快速掌握Matplotlib的核心绘图功能。Matplotlib是Python最流行的数据可视化库,用于创建各种静态、动态和交互式图表。

在本实验中,你会需要先阅读和运行基础示例,然后按 [step] 要求修改代码完成实验。

实验环境准备

# 安装matplotlib(如果尚未安装)
# pip install matplotlib

import matplotlib.pyplot as plt
import numpy as np

print("Matplotlib版本:", plt.__version__)

第1部分:基础绘图与样式定制

创建简单线图

[step 1] 要求:

  1. 创建x从0到4π,包含100个点的数组

  2. 绘制sin(x)和cos(x)的曲线,sin用红色实线,cos用蓝色虚线

  3. 添加标题"三角函数曲线",x轴标签"x",y轴标签"y"

  4. 添加图例,显示'sin(x)'和'cos(x)'

  5. 设置网格线

# 基础绘图示例
x = np.linspace(0, 2*np.pi, 50)
y_sin = np.sin(x)
y_cos = np.cos(x)

plt.figure(figsize=(10, 6))
plt.plot(x, y_sin, label='sin(x)')
plt.plot(x, y_cos, label='cos(x)')
plt.title('基础三角函数图')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True)
plt.show()

多子图布局

[step 2] 要求:

  1. 创建2×2的子图布局

  2. 左上:绘制sin(x)的散点图,点大小为20,颜色为红色

  3. 右上:绘制cos(x)的柱状图(使用bar)

  4. 左下:绘制tan(x),注意处理无穷大值

  5. 右下:绘制sin(x) + cos(x)的面积图

  6. 为每个子图添加标题

# 多子图示例
x = np.linspace(0, 2*np.pi, 20)

fig, axes = plt.subplots(2, 2, figsize=(12, 8))

# 子图1:线图
axes[0, 0].plot(x, np.sin(x))
axes[0, 0].set_title('正弦函数')

plt.tight_layout()
plt.show()

第2部分:高级图表与数据可视化

多种图表类型

[step 3] 要求:

  1. 创建包含3个子图的画布

  2. 左图:绘制随机数据的散点图,点大小和颜色随数据变化

  3. 中图:绘制3组随机数据的箱线图,添加均值标记

  4. 右图:绘制随机数据的直方图,设置透明度为0.7,添加密度曲线

# 多种图表类型示例
np.random.seed(42)
data1 = np.random.normal(0, 1, 100)
data2 = np.random.normal(1, 1.5, 100)

plt.figure(figsize=(15, 5))

# 散点图示例
plt.subplot(1, 3, 1)
plt.scatter(data1, data2)
plt.title('散点图')

plt.tight_layout()
plt.show()

热力图与颜色映射

[step 4] 要求:

  1. 创建10×10的随机矩阵,数值范围0-1

  2. 绘制热力图,使用'viridis'颜色映射

  3. 添加颜色条,设置标签"数值强度"

  4. 在热力图上显示数值文本(保留1位小数)

  5. 设置x轴和y轴标签为1-10

# 热力图示例
data = np.random.rand(5, 5)

plt.figure(figsize=(8, 6))
plt.imshow(data, cmap='hot')
plt.colorbar()
plt.title('热力图示例')
plt.show()

第3部分:实战应用-数据故事讲述

综合数据可视化项目

[step 5] 要求:分析模拟销售数据并创建完整的仪表板

  1. 数据准备:生成12个月的模拟销售数据,包含产品A、B、C的销售额

  2. 创建2×2的仪表板

    • 左上:月度总销售额趋势线图

    • 右上:各产品销售额堆叠面积图

    • 左下:产品销售额占比饼图

    • 右下:月度增长率柱状图

  3. 样式要求

    • 使用seaborn风格

    • 统一颜色主题

    • 添加总标题"年度销售分析仪表板"

    • 调整间距使布局美观

# 数据准备
months = ['1月', '2月', '3月', '4月', '5月', '6月', 
          '7月', '8月', '9月', '10月', '11月', '12月']
product_a = np.random.randint(1000, 5000, 12)
product_b = np.random.randint(800, 4000, 12)
product_c = np.random.randint(1200, 6000, 12)

# 基础图表示例
plt.style.use('seaborn')
fig, ax = plt.subplots(figsize=(10, 6))
x_pos = np.arange(len(months))

ax.bar(x_pos - 0.2, product_a, 0.2, label='产品A')
ax.bar(x_pos, product_b, 0.2, label='产品B')
ax.bar(x_pos + 0.2, product_c, 0.2, label='产品C')

ax.set_title('月度产品销售对比')
ax.set_xticks(x_pos)
ax.set_xticklabels(months)
ax.legend()

plt.show()

高级定制与输出

[step 6] 要求:

  1. 优化前面的销售仪表板,添加以下高级功能:

    • 在趋势图中标记最高和最低点

    • 在饼图中突出显示占比最大的产品

    • 在增长率图中用不同颜色区分正负增长

    • 添加自定义注释和箭头指向关键数据点

  2. 保存图表为高质量PNG文件(300 dpi)

  3. 在analysis.md中分析哪个图表最能有效传达信息,为什么?

# 图表保存示例
plt.figure(figsize=(10, 6))
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])
plt.savefig('my_plot.png', dpi=300, bbox_inches='tight')
plt.show()

实验总结

通过这个实验,你将掌握:

  • ✅ Matplotlib基础绘图和样式定制

  • ✅ 多子图布局和复杂图表创建

  • ✅ 数据可视化最佳实践

  • ✅ 图表导出和高级定制技巧

在analysis.md中回答:

  1. 多子图布局中,subplot()和subplots()的主要区别是什么?

  2. 在数据可视化中,如何选择合适的图表类型来传达信息?

  3. 高质量的科学图表应该具备哪些特征?