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()
相关推荐
杰瑞学AI44 分钟前
深度学习中的分布偏移问题及其解决方法
人工智能·深度学习·机器学习·ai
学算法的程霖1 小时前
分享|16个含源码和数据集的计算机视觉实战项目
人工智能·pytorch·深度学习·机器学习·计算机视觉·目标跟踪·研究生
带电的小王1 小时前
【动手学深度学习】2.3. 线性代数
人工智能·深度学习·线性代数
Listennnn1 小时前
点云(point cloud):自动驾驶的“三维扫描图“
人工智能·机器学习·自动驾驶
土拨鼠不是老鼠1 小时前
windows 下用yolov5 训练模型 给到opencv 使用
人工智能·opencv·yolo
小橘子就是小橘子1 小时前
9大开源AI智能体概况
人工智能·开源·ai agent
moonsims1 小时前
无人机桥梁检测如何通过数据存储、边缘AI、无线通讯等技术路线,提升检测效率
人工智能
moonsims1 小时前
无人机桥梁巡检
人工智能
黛琳ghz1 小时前
CodeBuddy(腾讯云代码助手)最新功能——智能体 Craft 体验
人工智能·vscode·ai·腾讯云·codebuddy·腾讯云代码助手·craft
视觉语言导航1 小时前
清华大学无人机城市空间导航探索!CityNavAgent:基于层次语义规划与全局记忆的空中视觉语言导航
人工智能·深度学习·无人机·智慧城市·具身智能