matplotlib基本绘图
运行前先安装依赖:
bash
pip install matplotlib numpy seaborn
作业 1:简单折线图绘制
作业描述:
使用 matplotlib 创建一个简单的折线图,展示函数 y = x² 的曲线。要求设置标题、坐标轴标签、网格线,并为折线添加数据标记。
python
import matplotlib.pyplot as plt
import numpy as np
# 配置matplotlib支持中文字体和LaTeX数学符号
plt.rcParams.update({
# 优先使用中文字体,同时保留serif用于LaTeX数学符号
"font.family": ["SimHei", "serif"],
"mathtext.fontset": "cm", # 使用Computer Modern字体渲染数学符号
"axes.unicode_minus": False, # 解决负号显示问题
"text.usetex": False, # 不强制使用外部LaTeX,依赖matplotlib内置渲染
})
# 生成数据
x = np.arange(1, 11) # x轴数据:1到10的整数
y = x ** 2 # y轴数据:x的平方
# 创建图形和坐标轴
plt.figure(figsize=(8, 5)) # 设置图形大小
# 绘制折线图,添加标记和样式
plt.plot(x, y, marker='o', linestyle='-', color='blue', label=r'$y = x^2$')
# plt.plot(x, y, marker='o', linestyle='-', color='blue', label='y = x²') # 直接写²
# 添加标题和标签
plt.title('平方函数折线图', fontsize=15)
plt.xlabel('X值', fontsize=12)
plt.ylabel('Y值 (X²)', fontsize=12)
# 添加网格和图例
plt.grid(True, linestyle='--', alpha=0.7) # 添加虚线网格
plt.legend() # 显示图例
# 显示图形
plt.tight_layout() # 自动调整布局
plt.show()

作业 2:多线图对比分析
作业描述:
创建一个双 Y 轴图表,同时展示正弦函数 sin(x) 和余弦函数 cos(x) 的曲线。要求使用不同颜色区分两条线,并为每个 Y 轴添加对应的标签。
python
import matplotlib.pyplot as plt
import numpy as np
# 配置matplotlib支持中文字体和LaTeX数学符号
plt.rcParams.update({
# 优先使用中文字体,同时保留serif用于LaTeX数学符号
"font.family": ["SimHei", "serif"],
"mathtext.fontset": "cm", # 使用Computer Modern字体渲染数学符号
"axes.unicode_minus": False, # 解决负号显示问题
"text.usetex": False, # 不强制使用外部LaTeX,依赖matplotlib内置渲染
})
# 生成数据
x = np.linspace(0, 10, 100) # 0到10之间的100个点
y1 = np.sin(x) # 正弦函数
y2 = np.cos(x) # 余弦函数
# 创建图形和双Y坐标轴
fig, ax1 = plt.subplots(figsize=(10, 6))
# 绘制正弦曲线(左Y轴)
color = 'tab:red'
ax1.set_xlabel('X值', fontsize=12)
ax1.set_ylabel('正弦值', color=color, fontsize=12)
ax1.plot(x, y1, color=color, linewidth=2, label='正弦')
ax1.tick_params(axis='y', labelcolor=color)
# 添加网格
ax1.grid(True, linestyle='--', alpha=0.7)
# 创建第二个Y轴(共享X轴)
ax2 = ax1.twinx()
# 绘制余弦曲线(右Y轴)
color = 'tab:blue'
ax2.set_ylabel('余弦值', color=color, fontsize=12)
ax2.plot(x, y2, color=color, linewidth=2, label='余弦')
ax2.tick_params(axis='y', labelcolor=color)
# 添加标题和图例
plt.title('正弦与余弦函数对比', fontsize=15)
lines1, labels1 = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax2.legend(lines1 + lines2, labels1 + labels2, loc='upper right')
# 显示图形
plt.tight_layout()
plt.show()

作业 3:散点图与数据可视化
作业描述:
使用散点图展示三维数据,其中 x、y 坐标表示位置,点的大小和颜色分别表示第三和第四个变量。要求添加颜色条和适当的标题、标签。
python
import matplotlib.pyplot as plt
import numpy as np
# 配置matplotlib支持中文字体和LaTeX数学符号
plt.rcParams.update({
# 优先使用中文字体,同时保留serif用于LaTeX数学符号
"font.family": ["SimHei", "serif"],
"mathtext.fontset": "cm", # 使用Computer Modern字体渲染数学符号
"axes.unicode_minus": False, # 解决负号显示问题
"text.usetex": False, # 不强制使用外部LaTeX,依赖matplotlib内置渲染
})
# 设置随机种子以确保结果可重现
np.random.seed(42)
# 生成四维数据
x = np.random.randn(100) # x坐标(随机正态分布)
y = np.random.randn(100) # y坐标(随机正态分布)
sizes = np.random.randint(20, 200, 100) # 点的大小(20-200之间随机整数)
colors = np.random.rand(100) # 点的颜色(0-1之间随机值)
# 创建图形
plt.figure(figsize=(10, 7))
# 绘制散点图,设置大小和颜色映射
scatter = plt.scatter(x, y, s=sizes, c=colors, alpha=0.7, cmap='viridis')
# 添加颜色条和标签
cbar = plt.colorbar(scatter)
cbar.set_label('颜色值', fontsize=12)
# 添加标题和坐标轴标签
plt.title('带大小和颜色映射的散点图', fontsize=15)
plt.xlabel('X坐标', fontsize=12)
plt.ylabel('Y坐标', fontsize=12)
# 添加网格
plt.grid(True, linestyle='--', alpha=0.7)
# 显示图形
plt.tight_layout()
plt.show()

作业 4:分组柱状图
作业描述:
创建一个分组柱状图,比较五个产品在 2023 年和 2024 年的销售额。要求在每个柱子上方标注具体数值,并添加图例和网格线。
python
import matplotlib.pyplot as plt
import numpy as np
# 配置matplotlib支持中文字体和LaTeX数学符号
plt.rcParams.update({
# 优先使用中文字体,同时保留serif用于LaTeX数学符号
"font.family": ["SimHei", "serif"],
"mathtext.fontset": "cm", # 使用Computer Modern字体渲染数学符号
"axes.unicode_minus": False, # 解决负号显示问题
"text.usetex": False, # 不强制使用外部LaTeX,依赖matplotlib内置渲染
})
# 设置随机种子以确保结果可重现
np.random.seed(42)
# 生成数据
products = ['产品A', '产品B', '产品C', '产品D', '产品E']
sales_2023 = np.random.randint(100, 500, 5) # 2023年销售额(100-500随机)
sales_2024 = np.random.randint(150, 600, 5) # 2024年销售额(150-600随机)
# 创建图形
plt.figure(figsize=(12, 7))
# 设置柱状图位置和宽度
x = np.arange(len(products))
width = 0.35
# 绘制两组柱状图
rects1 = plt.bar(x - width/2, sales_2023, width, label='2023年', color='skyblue')
rects2 = plt.bar(x + width/2, sales_2024, width, label='2024年', color='lightgreen')
# 添加标题和标签
plt.title('产品销售额对比(2023 vs 2024)', fontsize=15)
plt.xlabel('产品类别', fontsize=12)
plt.ylabel('销售额 (万元)', fontsize=12)
plt.xticks(x, products) # 设置x轴刻度标签
# 添加网格和图例
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.legend()
# 在柱子上方添加数值标签
def add_labels(rects):
for rect in rects:
height = rect.get_height()
plt.annotate(f'{height}',
xy=(rect.get_x() + rect.get_width() / 2, height),
xytext=(0, 3), # 垂直偏移3个点
textcoords="offset points",
ha='center', va='bottom')
add_labels(rects1)
add_labels(rects2)
# 显示图形
plt.tight_layout()
plt.show()

作业 5:堆叠柱状图
作业描述:
使用堆叠柱状图展示公司四个部门的收入、支出和利润情况。要求将支出堆叠在收入上方,并在每个柱子上方标注利润值。
python
import matplotlib.pyplot as plt
import numpy as np
# 配置matplotlib支持中文字体和LaTeX数学符号
plt.rcParams.update({
# 优先使用中文字体,同时保留serif用于LaTeX数学符号
"font.family": ["SimHei", "serif"],
"mathtext.fontset": "cm", # 使用Computer Modern字体渲染数学符号
"axes.unicode_minus": False, # 解决负号显示问题
"text.usetex": False, # 不强制使用外部LaTeX,依赖matplotlib内置渲染
})
# 设置随机种子以确保结果可重现
np.random.seed(42)
# 生成数据
departments = ['技术部', '市场部', '销售部', '人力资源部']
revenue = np.random.randint(100, 500, len(departments)) # 收入(100-500随机)
expenses = np.random.randint(50, 300, len(departments)) # 支出(50-300随机)
profit = revenue - expenses # 利润 = 收入 - 支出
# 创建图形
plt.figure(figsize=(10, 6))
# 设置柱状图位置和宽度
x = np.arange(len(departments))
width = 0.5
# 绘制堆叠柱状图
plt.bar(x, revenue, width, label='收入', color='skyblue')
plt.bar(x, expenses, width, bottom=revenue, label='支出', color='salmon')
# 在每个柱子上方添加利润标签
for i, val in enumerate(profit):
plt.text(i, revenue[i] + expenses[i] + 10, f'利润: {val}', ha='center')
# 添加标题和标签
plt.title('各部门收入与支出对比', fontsize=15)
plt.xlabel('部门', fontsize=12)
plt.ylabel('金额 (万元)', fontsize=12)
plt.xticks(x, departments)
# 添加图例和网格
plt.legend()
plt.grid(axis='y', linestyle='--', alpha=0.7)
# 显示图形
plt.tight_layout()
plt.show()

作业 6:饼图与百分比分析
作业描述:
创建一个饼图,展示五种产品的市场份额分布。要求突出显示最大份额的产品,并在每个扇区标注百分比。
python
import matplotlib.pyplot as plt
import numpy as np
# 配置matplotlib支持中文字体和LaTeX数学符号
plt.rcParams.update({
# 优先使用中文字体,同时保留serif用于LaTeX数学符号
"font.family": ["SimHei", "serif"],
"mathtext.fontset": "cm", # 使用Computer Modern字体渲染数学符号
"axes.unicode_minus": False, # 解决负号显示问题
"text.usetex": False, # 不强制使用外部LaTeX,依赖matplotlib内置渲染
})
# 设置随机种子以确保结果可重现
np.random.seed(42)
# 生成数据:五种产品的市场份额
products = ['产品A', '产品B', '产品C', '产品D', '产品E']
market_share = np.random.randint(5, 30, len(products)) # 随机生成5-30之间的市场份额
# 创建图形
plt.figure(figsize=(10, 8))
# 绘制饼图,突出显示最大份额的产品
explode = [0.1 if s == max(market_share) else 0 for s in market_share]
plt.pie(market_share,
labels=products,
autopct='%1.1f%%', # 显示百分比(保留一位小数)
shadow=True, # 添加阴影效果
startangle=90, # 从90度开始绘制
explode=explode) # 突出显示最大份额的产品
# 添加标题
plt.title('产品市场份额分布', fontsize=15)
# 设置为圆形(确保饼图是正圆)
plt.axis('equal')
# 显示图形
plt.tight_layout()
plt.show()

作业 7:直方图与数据分布
作业描述:
生成 1000 个符合正态分布的随机数,绘制直方图展示数据分布,并叠加理论正态分布曲线进行对比。要求添加标题、标签和图例。
python
import matplotlib.pyplot as plt
import numpy as np
# 配置matplotlib支持中文字体和LaTeX数学符号
plt.rcParams.update({
# 优先使用中文字体,同时保留serif用于LaTeX数学符号
"font.family": ["SimHei", "serif"],
"mathtext.fontset": "cm", # 使用Computer Modern字体渲染数学符号
"axes.unicode_minus": False, # 解决负号显示问题
"text.usetex": False, # 不强制使用外部LaTeX,依赖matplotlib内置渲染
})
# 设置随机种子以确保结果可重现
np.random.seed(42)
# 生成数据:1000个正态分布随机数(均值50,标准差10)
data = np.random.normal(50, 10, 1000)
# 创建图形
plt.figure(figsize=(10, 6))
# 绘制直方图(密度归一化)
n, bins, patches = plt.hist(data, bins=30, density=True, alpha=0.7,
color='skyblue', edgecolor='black')
# 计算理论正态分布曲线
mu, sigma = np.mean(data), np.std(data) # 计算样本均值和标准差
x = np.linspace(min(bins), max(bins), 100)
y = ((1 / (np.sqrt(2 * np.pi) * sigma)) *
np.exp(-0.5 * (1 / sigma * (x - mu))**2)) # 正态分布概率密度函数
# 绘制理论曲线
plt.plot(x, y, 'r--', linewidth=2, label='理论正态分布')
# 添加标题和标签
plt.title('数据分布直方图与理论正态分布对比', fontsize=15)
plt.xlabel('数值', fontsize=12)
plt.ylabel('概率密度', fontsize=12)
# 添加图例和网格
plt.legend()
plt.grid(axis='y', linestyle='--', alpha=0.7)
# 显示图形
plt.tight_layout()
plt.show()

作业 8:箱线图与数据统计
作业描述:
模拟四个班级的考试成绩数据,使用箱线图比较各班成绩的分布情况。要求在图中显示中位数、四分位数和异常值。
python
import matplotlib.pyplot as plt
import numpy as np
# 配置matplotlib支持中文字体和LaTeX数学符号
plt.rcParams.update({
# 优先使用中文字体,同时保留serif用于LaTeX数学符号
"font.family": ["SimHei", "serif"],
"mathtext.fontset": "cm", # 使用Computer Modern字体渲染数学符号
"axes.unicode_minus": False, # 解决负号显示问题
"text.usetex": False, # 不强制使用外部LaTeX,依赖matplotlib内置渲染
})
# 设置随机种子以确保结果可重现
np.random.seed(42)
# 生成四个班级的考试成绩数据(不同均值和标准差)
class1 = np.random.normal(70, 10, 50) # 班级1:均值70,标准差10
class2 = np.random.normal(75, 5, 50) # 班级2:均值75,标准差5(成绩更集中)
class3 = np.random.normal(65, 15, 50) # 班级3:均值65,标准差15(成绩更分散)
class4 = np.random.normal(72, 8, 50) # 班级4:均值72,标准差8
# 合并数据
data = [class1, class2, class3, class4]
labels = ['班级1', '班级2', '班级3', '班级4']
# 创建图形
plt.figure(figsize=(12, 7))
# 绘制箱线图
plt.boxplot(data, tick_labels=labels, patch_artist=True,
boxprops=dict(facecolor='skyblue', color='black'),
whiskerprops=dict(color='black'),
medianprops=dict(color='red', linewidth=2)) # 突出显示中位数
# 添加标题和标签
plt.title('四个班级考试成绩分布比较', fontsize=15)
plt.xlabel('班级', fontsize=12)
plt.ylabel('考试成绩', fontsize=12)
# 添加网格
plt.grid(axis='y', linestyle='--', alpha=0.7)
# 显示图形
plt.tight_layout()
plt.show()

作业 9:热力图与相关性分析
作业描述:
创建一个热力图,展示五个产品在 12 个月内的销售数据。要求使用颜色深浅表示销售额高低,并在每个单元格中标注具体数值。
python
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns # 用于绘制热力图
# 配置matplotlib支持中文字体和LaTeX数学符号
plt.rcParams.update({
# 优先使用中文字体,同时保留serif用于LaTeX数学符号
"font.family": ["SimHei", "serif"],
"mathtext.fontset": "cm", # 使用Computer Modern字体渲染数学符号
"axes.unicode_minus": False, # 解决负号显示问题
"text.usetex": False, # 不强制使用外部LaTeX,依赖matplotlib内置渲染
})
# 设置随机种子以确保结果可重现
np.random.seed(42)
# 生成数据:12个月和5个产品的销售数据
months = ['一月', '二月', '三月', '四月', '五月', '六月',
'七月', '八月', '九月', '十月', '十一月', '十二月']
products = ['产品A', '产品B', '产品C', '产品D', '产品E']
# 创建随机销售数据矩阵(范围100-500)
sales_data = np.random.randint(100, 500, size=(len(months), len(products)))
# 创建图形
plt.figure(figsize=(12, 8))
# 绘制热力图
sns.heatmap(sales_data, annot=True, fmt='d', cmap='YlGnBu', # YlGnBu颜色方案
xticklabels=products, yticklabels=months,
linewidths=0.5, cbar_kws={'label': '销售额'}) # 添加颜色条标签
# 添加标题
plt.title('产品月度销售额热力图', fontsize=15)
# 调整布局
plt.tight_layout()
# 显示图形
plt.show()

作业 10:3D 散点图
作业描述:
使用 3D 散点图可视化三维空间中的数据点,其中 x、y、z 坐标分别表示三个变量,点的颜色表示距离原点的距离。要求添加坐标轴标签和颜色条。
python
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D # 3D绘图工具包
# 配置matplotlib支持中文字体和LaTeX数学符号
plt.rcParams.update({
# 优先使用中文字体,同时保留serif用于LaTeX数学符号
"font.family": ["SimHei", "serif"],
"mathtext.fontset": "cm", # 使用Computer Modern字体渲染数学符号
"axes.unicode_minus": False, # 解决负号显示问题
"text.usetex": False, # 不强制使用外部LaTeX,依赖matplotlib内置渲染
})
# 设置随机种子以确保结果可重现
np.random.seed(42)
# 生成三维数据
x = np.random.randn(100) # x坐标(随机正态分布)
y = np.random.randn(100) # y坐标(随机正态分布)
z = np.random.randn(100) # z坐标(随机正态分布)
# 计算颜色值(基于距离原点的距离)
colors = np.sqrt(x**2 + y**2 + z**2)
# 创建图形和3D坐标轴
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
# 绘制3D散点图
scatter = ax.scatter(x, y, z, c=colors, cmap='viridis', s=50, alpha=0.7)
# 添加颜色条
cbar = plt.colorbar(scatter)
cbar.set_label('距离原点的距离', fontsize=12)
# 添加标题和坐标轴标签
ax.set_title('3D散点图示例', fontsize=15)
ax.set_xlabel('X轴', fontsize=12)
ax.set_ylabel('Y轴', fontsize=12)
ax.set_zlabel('Z轴', fontsize=12)
# 设置坐标轴范围,使图形更加美观
max_range = max([np.ptp(x), np.ptp(y), np.ptp(z)]) # 计算最大范围
mid_x = (x.max() + x.min()) / 2 # 计算x轴中间值
mid_y = (y.max() + y.min()) / 2 # 计算y轴中间值
mid_z = (z.max() + z.min()) / 2 # 计算z轴中间值
# 设置相同的坐标轴范围
ax.set_xlim(mid_x - max_range/2, mid_x + max_range/2)
ax.set_ylim(mid_y - max_range/2, mid_y + max_range/2)
ax.set_zlim(mid_z - max_range/2, mid_z + max_range/2)
# 显示图形
plt.tight_layout()
plt.show()
