matplotlib基本绘图

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()
相关推荐
猎嘤一号27 分钟前
使用 PyTorch 和 SwanLab 实时可视化模型训练
人工智能·pytorch·深度学习
Jay Kay28 分钟前
论文阅读:强化预训练
人工智能·语言模型·自然语言处理
蹦蹦跳跳真可爱5892 小时前
Python----神经网络发(神经网络发展历程)
人工智能·python·深度学习·神经网络·计算机视觉
学步_技术2 小时前
增强现实—Flame: Learning to navigate with multimodal llm in urban environments
人工智能·机器学习·计算机视觉·语言模型·自然语言处理·ar
飞飞是甜咖啡3 小时前
【机器学习】Teacher-Student框架
人工智能·算法·机器学习
愿所愿皆可成3 小时前
机器学习之集成学习
人工智能·随机森林·机器学习·集成学习
广州正荣3 小时前
成绩管理革新者:C++驱动的智能数据处理平台
c++·人工智能·科技
Prokint.3 小时前
GPU算力租用平台推荐(AI/游戏串流/渲染/办公)
人工智能·游戏·云计算·gpu算力
king of code porter4 小时前
深度学习之模型压缩三驾马车:基于ResNet18的模型剪枝实战(3)
人工智能·深度学习·剪枝
DUTBenjamin4 小时前
深度学习5——循环神经网络
人工智能·rnn·深度学习