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] 要求:
创建x从0到4π,包含100个点的数组
绘制sin(x)和cos(x)的曲线,sin用红色实线,cos用蓝色虚线
添加标题"三角函数曲线",x轴标签"x",y轴标签"y"
添加图例,显示'sin(x)'和'cos(x)'
设置网格线
# 基础绘图示例
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] 要求:
创建2×2的子图布局
左上:绘制sin(x)的散点图,点大小为20,颜色为红色
右上:绘制cos(x)的柱状图(使用bar)
左下:绘制tan(x),注意处理无穷大值
右下:绘制sin(x) + cos(x)的面积图
为每个子图添加标题
# 多子图示例
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] 要求:
创建包含3个子图的画布
左图:绘制随机数据的散点图,点大小和颜色随数据变化
中图:绘制3组随机数据的箱线图,添加均值标记
右图:绘制随机数据的直方图,设置透明度为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] 要求:
创建10×10的随机矩阵,数值范围0-1
绘制热力图,使用'viridis'颜色映射
添加颜色条,设置标签"数值强度"
在热力图上显示数值文本(保留1位小数)
设置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] 要求:分析模拟销售数据并创建完整的仪表板
数据准备:生成12个月的模拟销售数据,包含产品A、B、C的销售额
创建2×2的仪表板:
左上:月度总销售额趋势线图
右上:各产品销售额堆叠面积图
左下:产品销售额占比饼图
右下:月度增长率柱状图
样式要求:
使用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] 要求:
优化前面的销售仪表板,添加以下高级功能:
在趋势图中标记最高和最低点
在饼图中突出显示占比最大的产品
在增长率图中用不同颜色区分正负增长
添加自定义注释和箭头指向关键数据点
保存图表为高质量PNG文件(300 dpi)
在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中回答:
多子图布局中,subplot()和subplots()的主要区别是什么?
在数据可视化中,如何选择合适的图表类型来传达信息?
高质量的科学图表应该具备哪些特征?