Matplotlib(三)- 图表辅助元素

发布于:2025-07-30 ⋅ 阅读:(26) ⋅ 点赞:(0)


一、图表辅助元素简介

在数据可视化中,除了核心的图表内容(如折线、柱形、散点等),辅助元素是提升图表可读性、信息完整性和美观度的关键组成部分。它们能够帮助读者快速理解图表的主题、数据含义、坐标轴范围以及数据间的关联,是专业图表不可或缺的一部分。

常见的图表辅助元素包括以下几类:

辅助元素类别 作用描述 典型使用场景 示例代码(Matplotlib)
标题(Title) 概括图表核心内容,让读者快速了解数据主题 所有图表均需,通常位于图表上方 plt.title("2021-2022年发电量对比", fontsize=12)
坐标轴标签 明确坐标轴代表的数据含义及单位,避免维度误解 除极简图表外均需,尤其坐标轴无默认含义时 plt.xlabel("年份")
plt.ylabel("发电量(亿千瓦时)")
图例(Legend) 区分多数据系列(如多条折线、多组柱形)的含义 多数据系列图表必须添加,位置需避免遮挡核心数据 plt.legend(labels=["用户1", "用户2"], loc="upper right")
网格线(Grid) 通过参考线帮助读者精准读取数据值、比较差异 需精确读取数据的图表(折线图、散点图等),避免过密导致杂乱 plt.grid(linestyle="--", alpha=0.7)(虚线样式,透明度0.7)
刻度与刻度标签 刻度为坐标轴标记点,刻度标签为对应数值,用于量化数据范围 所有带坐标轴的图表,可自定义间隔(如时间序列按季度显示) plt.xticks(ticks=[1,2,3,4], labels=["Q1", "Q2", "Q3", "Q4"])
注释(Annotation) 对关键数据点、异常值或特殊趋势补充说明,增强信息深度 数据存在需强调的特殊信息时(如政策节点、峰值),避免过度注释 plt.annotate("政策调整点", xy=(5, 120), xytext=(6, 130), arrowprops=dict(arrowstyle="->"))
数据标签 直接在图表元素(柱形、扇形等)上标注具体数值,避免二次推测 数据量较少的图表(饼图、简单柱形图),数据过多易重叠 饼图百分比标签:plt.pie(values, autopct="%1.1f%%")
背景与边框 调整背景色、隐藏冗余边框(如上、右边框),减少视觉干扰,突出图表内容 所有图表均可优化,适合简洁风格可视化 plt.gca().spines["top"].set_visible(False)(隐藏上边框)

二、坐标轴的标签、刻度范围和刻度标签

1. 坐标轴标签

在 Matplotlib 中,可以通过 plt.xlabel()plt.ylabel() 函数分别为 x轴y轴 添加标签,以增强图表的可读性和表达力。

1.1 x轴标签

使用 plt.xlabel() 函数可以为 x轴 添加标签。

参数名 描述
xlabel 要显示的标签文本(字符串)
fontdict 字体字典,用于设置字体大小、颜色、样式等
labelpad 标签与坐标轴之间的距离(像素)
loc 标签的位置,可选 'center''left''right'
**kwargs 其他文本属性,如 colorfontsizerotation

1.2 y轴标签

使用 plt.ylabel() 函数可以为 y轴 添加标签。

参数名 描述
ylabel 要显示的标签文本(字符串)
fontdict 字体字典,用于设置字体大小、颜色、样式等
labelpad 标签与坐标轴之间的距离(像素)
loc 标签的位置,可选 'center''top''bottom'
**kwargs 其他文本属性,如 colorfontsizerotation

1.3 示例:绘制天气气温折线图

数据如下图所示,需要根据这个数据绘制气温折线图,并设置x轴和y轴标签。

在这里插入图片描述

实现代码如下所示:

import matplotlib.pyplot as plt
import pandas as pd

# 设置中文字体为 SimHei(黑体),确保中文标签可以正常显示(可选)
plt.rcParams['font.sans-serif'] = ['SimHei']

# 解决负号 '-' 显示为方块的问题,保证负号正常显示
plt.rcParams['axes.unicode_minus'] = False

# 请将此处替换为你的CSV文件路径
csv_file_path = './data/气温.csv'
# 读取CSV文件
df = pd.read_csv(csv_file_path)

# 处理日期格式
df['日期'] = pd.to_datetime(df['日期'])

# 提取温度数值(去除℃符号并转换为整数)
df['最高气温'] = df['最高气温'].str.replace('℃', '').astype(int)
df['最低气温'] = df['最低气温'].str.replace('℃', '').astype(int)

# 绘制折线图
# plt.plot(df['日期'], df['最高气温'])
# plt.plot(df['日期'], df['最低气温'])
plt.plot('日期', '最高气温', data=df)
plt.plot('日期', '最低气温', data=df)

# 设置x轴日期格式,自动旋转日期标签
plt.gcf().autofmt_xdate()

# 设置 x 轴的标签(xlabel)
plt.xlabel(
    xlabel='日 期',  # 标签内容,显示为“日 期”
    fontdict={'fontsize': 12, 'color': '#000', 'fontweight': 'bold'},  # 设置字体样式:字体大小12,颜色为黑色,加粗
    labelpad=10,  # 标签与坐标轴之间的距离(以像素为单位)
    loc='center'  # 标签在 x 轴上的对齐方式,'center' 表示居中对齐
)

# 设置 y 轴的标签(ylabel)
plt.ylabel(
    ylabel='气 温',  # 标签内容,显示为“气 温”
    fontdict={'fontsize': 12, 'color': '#000', 'color': '#000', 'fontweight': 'bold'},  # 设置字体样式:字体大小12,颜色为黑色,加粗
    labelpad=5,  # 标签与坐标轴之间的距离(以像素为单位)
    loc='center'  # 标签在 y 轴上的对齐方式,'center' 表示居中对齐
)

# 显示图形
plt.show()

绘制的图形如下图所示:

在这里插入图片描述

2. 刻度范围和刻度标签

2.1 刻度范围

2.1.1 x轴刻度范围

使用 plt.xlim() 函数可以设置或获取 x轴的显示范围

参数名 描述 示例
*args 可以是一个元组 (xmin, xmax),也可以是两个参数 xmin, xmax plt.xlim((0, 5))plt.xlim(0, 5)
emit 是否通知图形更新(一般无需修改) 默认为 True
auto 是否自动调整刻度范围 plt.xlim(auto=True)
xmin 设置x轴的最小值 plt.xlim(xmin=1)
xmax 设置x轴的最大值 plt.xlim(xmax=10)
2.1.2 y轴刻度范围

使用 plt.ylim() 函数可以设置或获取 y轴的显示范围

参数名 描述 示例
*args 可以是一个元组 (ymin, ymax),也可以是两个参数 ymin, ymax plt.ylim((0, 6))plt.ylim(0, 6)
emit 是否通知图形更新 默认为 True
auto 是否自动调整刻度范围 plt.ylim(auto=True)
ymin 设置y轴的最小值 plt.ylim(ymin=1)
ymax 设置y轴的最大值 plt.ylim(ymax=10)

2.2 刻度标签

2.2.1 x轴刻度标签

使用 plt.xticks() 函数可以设置 x轴刻度的位置和对应的标签

参数名 描述 示例
ticks 指定刻度位置的列表 ticks=[0, 1, 2]
labels 对应每个刻度位置的标签列表 labels=['A', 'B', 'C']
rotation 标签旋转角度 rotation=45
fontsize 标签字体大小 fontsize=12
color 标签颜色 color='red'
2.2.2 y轴刻度标签

使用 plt.yticks() 函数可以设置 y轴刻度的位置和对应的标签

参数名 描述 示例
ticks 指定刻度位置的列表 ticks=[0, 2, 4]
labels 对应每个刻度位置的标签列表 labels=['低', '中', '高']
rotation 标签旋转角度 rotation=90
fontsize 标签字体大小 fontsize=12
color 标签颜色 color='red'

2.3 示例:绘制天气气温折线图

数据如下图所示,需要根据这个数据绘制气温折线图,并设置x轴和y轴的刻度范围和刻度标签。

在这里插入图片描述

实现代码如下所示:

from datetime import datetime

import matplotlib.pyplot as plt
import pandas as pd

# 设置中文字体为 SimHei(黑体),确保中文标签可以正常显示(可选)
plt.rcParams['font.sans-serif'] = ['SimHei']

# 解决负号 '-' 显示为方块的问题,保证负号正常显示
plt.rcParams['axes.unicode_minus'] = False

# 请将此处替换为你的CSV文件路径
csv_file_path = './data/气温.csv'
# 读取CSV文件
df = pd.read_csv(csv_file_path)

# 处理日期格式
df['日期'] = pd.to_datetime(df['日期'])

# 提取温度数值(去除℃符号并转换为整数)
df['最高气温'] = df['最高气温'].str.replace('℃', '').astype(int)
df['最低气温'] = df['最低气温'].str.replace('℃', '').astype(int)

# 绘制折线图
# plt.plot(df['日期'], df['最高气温'])
# plt.plot(df['日期'], df['最低气温'])
plt.plot('日期', '最高气温', data=df)
plt.plot('日期', '最低气温', data=df)

# 设置x轴日期格式,自动旋转日期标签
plt.gcf().autofmt_xdate()

# 设置 x 轴的标签(xlabel)
plt.xlabel(
    xlabel='日 期',  # 标签内容,显示为“日 期”
    fontdict={'fontsize': 12, 'color': '#000', 'fontweight': 'bold'},  # 设置字体样式:字体大小12,颜色为黑色,加粗
    labelpad=10,  # 标签与坐标轴之间的距离(以像素为单位)
    loc='center'  # 标签在 x 轴上的对齐方式,'center' 表示居中对齐
)

# 设置 y 轴的标签(ylabel)
plt.ylabel(
    ylabel='气 温',  # 标签内容,显示为“气 温”
    fontdict={'fontsize': 12, 'color': '#000', 'color': '#000', 'fontweight': 'bold'},  # 设置字体样式:字体大小12,颜色为黑色,加粗
    labelpad=5,  # 标签与坐标轴之间的距离(以像素为单位)
    loc='center'  # 标签在 y 轴上的对齐方式,'center' 表示居中对齐
)

# 设置 x 轴(时间)的显示范围
# 从 2025年7月8日 开始,到 2025年7月25日 结束
start_time = datetime(2025, 7, 8)
end_time = datetime(2025, 7, 25)

# 设置 x 轴的范围(时间范围)
plt.xlim((start_time, end_time))

# 设置 y 轴的数值范围,从 13 到 26
plt.ylim(ymin=13, ymax=26)

# 设置 x 轴的刻度位置和刻度标签
# rotation:刻度标签旋转角度(30度)
# color:刻度标签颜色(蓝色系)
# fontsize:字体大小
# ticks:指定刻度的位置(字符串日期)
# labels:对应每个刻度位置的显示标签(中文格式)
plt.xticks(rotation=30,
           color='#09f',
           fontsize=10,
           ticks=[
               '2025-07-09', '2025-07-10', '2025-07-11', '2025-07-12', '2025-07-13',
               '2025-07-14', '2025-07-15', '2025-07-16', '2025-07-17', '2025-07-18',
               '2025-07-19', '2025-07-20', '2025-07-21', '2025-07-22', '2025-07-23',
               '2025-07-24', '2025-07-25'
           ],
           labels=[
               '9日', '10日', '11日', '12日', '13日', '14日', '15日', '16日',
               '17日', '18日', '19日', '20日', '21日', '22日', '23日', '24日', '25日'
           ])

# 设置 y 轴的刻度位置和刻度标签
# rotation:标签旋转角度
# color:标签颜色
# fontsize:字体大小
# ticks:刻度位置
# labels:显示的标签(添加了温度单位 ℃)
plt.yticks(rotation=30,
           color='#09f',
           fontsize=10,
           ticks=[13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
           labels=['13℃', '14℃', '15℃', '16℃', '17℃', '18℃', '19℃', '20℃',
                   '21℃', '22℃', '23℃', '24℃', '25℃', '26℃'])

# 显示图形
plt.show()

绘制的图形如下图所示:

在这里插入图片描述


三、标题和图例

在 Matplotlib 中,标题(Title)图例(Legend) 是图表中非常重要的组成部分,它们可以增强图表的可读性和表达能力,帮助读者更好地理解图表内容。

1. 标题(Title)

使用 plt.title() 函数可以为当前图表添加一个标题。

参数名 描述 示例
label 标题文本内容 '气温变化趋势图'
fontdict 字体字典,用于设置字体大小、颜色、样式等 {'fontsize': 14, 'color': 'red'}
loc 标题位置,可选 'center''left''right' 'center'
pad 标题与图表顶部之间的间距(像素) 20
**kwargs 其他文本属性,如 color, fontsize, rotation color='blue', fontsize=12

2. 图例(Legend)

使用 plt.legend() 函数可以为图表添加图例,用于说明每条曲线或每个图形对象的含义。

参数名 描述 示例
labels 图例标签列表 ['曲线A', '曲线B']
loc 图例位置,常用 'upper right', 'lower left', 'center' 'upper right'
bbox_to_anchor 图例锚点位置(用于精确定位) (1.05, 1)
ncol 图例列数 2
title 图例标题 '图例说明'
fontsize 图例字体大小 10
frameon 是否显示图例边框 False
shadow 是否添加阴影 True
markerscale 图例中点标记的大小缩放比例 1.5

图例位置编码和字符串说明:

位置编码 字符串描述 位置描述
0 'best' 自动选择最佳位置(避免与其他元素重叠)
1 'upper right' 右上角
2 'upper left' 左上角
3 'lower left' 左下角
4 'lower right' 右下角
5 'right' 右侧中心
6 'center left' 中心左侧
7 'center right' 中心右侧
8 'lower center' 下方中心
9 'upper center' 上方中心
10 'center' 正中间

3 示例:绘制天气气温折线图

数据如下图所示,需要根据这个数据绘制气温折线图,并设置x轴和y轴的刻度范围和刻度标签,以及标题和图例。

在这里插入图片描述

实现代码如下所示:

from datetime import datetime

import matplotlib.pyplot as plt
import pandas as pd

# 设置中文字体为 SimHei(黑体),确保中文标签可以正常显示(可选)
plt.rcParams['font.sans-serif'] = ['SimHei']

# 解决负号 '-' 显示为方块的问题,保证负号正常显示
plt.rcParams['axes.unicode_minus'] = False

# 请将此处替换为你的CSV文件路径
csv_file_path = './data/气温.csv'
# 读取CSV文件
df = pd.read_csv(csv_file_path)

# 处理日期格式
df['日期'] = pd.to_datetime(df['日期'])

# 提取温度数值(去除℃符号并转换为整数)
df['最高气温'] = df['最高气温'].str.replace('℃', '').astype(int)
df['最低气温'] = df['最低气温'].str.replace('℃', '').astype(int)

# 绘制折线图
# plt.plot(df['日期'], df['最高气温'])
# plt.plot(df['日期'], df['最低气温'])
plt.plot('日期', '最高气温', data=df)
plt.plot('日期', '最低气温', data=df)

# 设置x轴日期格式,自动旋转日期标签
plt.gcf().autofmt_xdate()

# 设置 x 轴的标签(xlabel)
plt.xlabel(
    xlabel='日 期',  # 标签内容,显示为“日 期”
    fontdict={'fontsize': 12, 'color': '#000', 'fontweight': 'bold'},  # 设置字体样式:字体大小12,颜色为黑色,加粗
    labelpad=10,  # 标签与坐标轴之间的距离(以像素为单位)
    loc='center'  # 标签在 x 轴上的对齐方式,'center' 表示居中对齐
)

# 设置 y 轴的标签(ylabel)
plt.ylabel(
    ylabel='气 温',  # 标签内容,显示为“气 温”
    fontdict={'fontsize': 12, 'color': '#000', 'color': '#000', 'fontweight': 'bold'},  # 设置字体样式:字体大小12,颜色为黑色,加粗
    labelpad=5,  # 标签与坐标轴之间的距离(以像素为单位)
    loc='center'  # 标签在 y 轴上的对齐方式,'center' 表示居中对齐
)

# 设置 x 轴(时间)的显示范围
# 从 2025年7月8日 开始,到 2025年7月25日 结束
start_time = datetime(2025, 7, 8)
end_time = datetime(2025, 7, 25)

# 设置 x 轴的范围(时间范围)
plt.xlim((start_time, end_time))

# 设置 y 轴的数值范围,从 13 到 26
plt.ylim(ymin=13, ymax=26)

# 设置 x 轴的刻度位置和刻度标签
# rotation:刻度标签旋转角度(30度)
# color:刻度标签颜色(蓝色系)
# fontsize:字体大小
# ticks:指定刻度的位置(字符串日期)
# labels:对应每个刻度位置的显示标签(中文格式)
plt.xticks(rotation=30,
           color='#09f',
           fontsize=10,
           ticks=[
               '2025-07-09', '2025-07-10', '2025-07-11', '2025-07-12', '2025-07-13',
               '2025-07-14', '2025-07-15', '2025-07-16', '2025-07-17', '2025-07-18',
               '2025-07-19', '2025-07-20', '2025-07-21', '2025-07-22', '2025-07-23',
               '2025-07-24', '2025-07-25'
           ],
           labels=[
               '9日', '10日', '11日', '12日', '13日', '14日', '15日', '16日',
               '17日', '18日', '19日', '20日', '21日', '22日', '23日', '24日', '25日'
           ])

# 设置 y 轴的刻度位置和刻度标签
# rotation:标签旋转角度
# color:标签颜色
# fontsize:字体大小
# ticks:刻度位置
# labels:显示的标签(添加了温度单位 ℃)
plt.yticks(rotation=30,
           color='#09f',
           fontsize=10,
           ticks=[13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
           labels=['13℃', '14℃', '15℃', '16℃', '17℃', '18℃', '19℃', '20℃',
                   '21℃', '22℃', '23℃', '24℃', '25℃', '26℃'])

# 设置图表标题
plt.title(
    label='2025年7月8日至2025年7月25日的气温变化',  # 标题内容
    fontdict={'fontsize': 14, 'color': '#09f'},  # 字体样式:大小14,颜色为蓝色(#09f)
    loc='center',  # 标题对齐方式:居中
    pad=10,  # 标题与图表顶部的距离(以像素为单位)
    fontweight='bold',  # 字体加粗(此参数可被 fontdict 覆盖)
    color='red',  # 标题文字颜色(若设置,会覆盖 fontdict 中的颜色)
    backgroundcolor='lightblue'  # 设置标题背景颜色为浅蓝色
)

# 设置图例(legend)
plt.legend(
    labels=['最高气温', '最低气温'],  # 图例中显示的标签名称
    loc='lower left',  # 图例放置的位置:左下角
    ncol=1,  # 图例分为1列(纵向排列)
    title='天气温度',  # 图例的标题
    fontsize=10,  # 图例文字的字体大小
    frameon=True,  # 是否显示图例边框
    edgecolor='blue',  # 图例边框颜色
    facecolor='lightblue',  # 图例背景颜色
    shadow=True,  # 是否添加阴影效果
    fancybox=True  # 是否使用圆角边框(False 为直角)
)

# 显示图形
plt.show()

绘制的图形如下图所示:

在这里插入图片描述

4. 示例:绘制账单饼图

数据如下图所示,需要根据这个数据绘制账单饼图,并添加图例。

在这里插入图片描述

实现代码如下图所示:

# 导入matplotlib.pyplot模块,用于绘图功能。
import matplotlib.pyplot as plt

# 导入pandas模块,并使用pd作为别名。Pandas是一个强大的数据处理和分析库。
import pandas as pd

# 设置matplotlib的中文字体为SimHei(黑体),以确保中文标签可以正常显示。
plt.rcParams['font.sans-serif'] = ['SimHei']

# 解决负号'-'显示为方块的问题,通过设置'axes.unicode_minus'为False来实现。
plt.rcParams['axes.unicode_minus'] = False

# 定义包含CSV文件路径的变量。这里假设账单数据存储在一个名为'账单.csv'的文件中。
csv_file_path = './data/账单.csv'

# 使用pandas的read_csv函数读取CSV文件中的数据,并将其存储在一个DataFrame对象中。
df = pd.read_csv(csv_file_path)

# 从DataFrame中提取'金额'列的数据,用于表示饼图各个部分的大小或贡献度。
x = df['金额']

# 从DataFrame中提取'支出分类'列的数据,用作饼图各部分的标签,以便了解每个部分代表什么。
labels = df['支出分类']

# 使用plt.pie()函数绘制饼图:
# 参数x指定数据列表,决定了饼图各个扇区的大小;
# labels参数指定与x列表对应的数据标签,帮助识别每个扇区所代表的类别;
# autopct参数设置为'%.1f%%',用于在饼图上显示百分比数值,保留一位小数。
plt.pie(x=x, labels=labels, autopct='%.1f%%')

# 设置图表标题
plt.title(
    label='账单饼图',  # 标题文本内容
    color='blue',  # 标题文字颜色为蓝色
    backgroundcolor='lightblue',  # 标题背景颜色为浅蓝色
    pad=0  # 标题与图表顶部的距离(以像素为单位),这里设置为0,即没有额外的间距
)

# 设置图例(legend)
plt.legend(
    labels=labels,  # 图例中显示的标签名称列表,这里的 `labels` 应该是一个预定义好的列表变量
    bbox_to_anchor=(1.25, 1.11),  # 图例框的位置,(x, y) 坐标。相对于图形边界或图形本身的位置取决于使用的布局管理器
    facecolor='lightblue'  # 图例背景颜色为浅蓝色
)

# 调用plt.show()函数显示图形结果。这是展示已创建图表的必要步骤。
plt.show()

绘制的图形如下图所示:

在这里插入图片描述


四、网格

1. 网格

在Matplotlib中,网格(Grid)是用于辅助观察数据点的位置而添加的背景线。通过使用 plt.grid() 方法,可以轻松地为图表添加或移除网格线。

以下表格详细介绍了 plt.grid() 方法的主要参数:

参数名 描述 可选值/格式 示例
visible 开启或关闭网格 TrueFalse True(开启网格)
which 选择应用网格的刻度类型 'major', 'minor', 'both' 'both'(同时应用于主次刻度)
axis 选择应用网格的轴方向 'x', 'y', 'both' 'x'(仅应用于X轴)
**kwargs 网格属性设置,如颜色、样式等 例如:color='blue', linestyle='--' color='green', linestyle=':'

2. 示例:绘制天气气温折线图

数据如下图所示,需要根据这个数据绘制气温折线图,并设置x轴和y轴的刻度范围和刻度标签、标题、图例和网格线。

在这里插入图片描述

实现代码如下所示:

from datetime import datetime

import matplotlib.pyplot as plt
import pandas as pd

# 设置中文字体为 SimHei(黑体),确保中文标签可以正常显示(可选)
plt.rcParams['font.sans-serif'] = ['SimHei']

# 解决负号 '-' 显示为方块的问题,保证负号正常显示
plt.rcParams['axes.unicode_minus'] = False

# 请将此处替换为你的CSV文件路径
csv_file_path = './data/气温.csv'
# 读取CSV文件
df = pd.read_csv(csv_file_path)

# 处理日期格式
df['日期'] = pd.to_datetime(df['日期'])

# 提取温度数值(去除℃符号并转换为整数)
df['最高气温'] = df['最高气温'].str.replace('℃', '').astype(int)
df['最低气温'] = df['最低气温'].str.replace('℃', '').astype(int)

# 绘制折线图
# plt.plot(df['日期'], df['最高气温'])
# plt.plot(df['日期'], df['最低气温'])
plt.plot('日期', '最高气温', data=df)
plt.plot('日期', '最低气温', data=df)

# 设置x轴日期格式,自动旋转日期标签
plt.gcf().autofmt_xdate()

# 设置 x 轴的标签(xlabel)
plt.xlabel(
    xlabel='日 期',  # 标签内容,显示为“日 期”
    fontdict={'fontsize': 12, 'color': '#000', 'fontweight': 'bold'},  # 设置字体样式:字体大小12,颜色为黑色,加粗
    labelpad=10,  # 标签与坐标轴之间的距离(以像素为单位)
    loc='center'  # 标签在 x 轴上的对齐方式,'center' 表示居中对齐
)

# 设置 y 轴的标签(ylabel)
plt.ylabel(
    ylabel='气 温',  # 标签内容,显示为“气 温”
    fontdict={'fontsize': 12, 'color': '#000', 'color': '#000', 'fontweight': 'bold'},  # 设置字体样式:字体大小12,颜色为黑色,加粗
    labelpad=5,  # 标签与坐标轴之间的距离(以像素为单位)
    loc='center'  # 标签在 y 轴上的对齐方式,'center' 表示居中对齐
)

# 设置 x 轴(时间)的显示范围
# 从 2025年7月8日 开始,到 2025年7月25日 结束
start_time = datetime(2025, 7, 8)
end_time = datetime(2025, 7, 25)

# 设置 x 轴的范围(时间范围)
plt.xlim((start_time, end_time))

# 设置 y 轴的数值范围,从 13 到 26
plt.ylim(ymin=13, ymax=26)

# 设置 x 轴的刻度位置和刻度标签
# rotation:刻度标签旋转角度(30度)
# color:刻度标签颜色(蓝色系)
# fontsize:字体大小
# ticks:指定刻度的位置(字符串日期)
# labels:对应每个刻度位置的显示标签(中文格式)
plt.xticks(rotation=30,
           color='#09f',
           fontsize=10,
           ticks=[
               '2025-07-09', '2025-07-10', '2025-07-11', '2025-07-12', '2025-07-13',
               '2025-07-14', '2025-07-15', '2025-07-16', '2025-07-17', '2025-07-18',
               '2025-07-19', '2025-07-20', '2025-07-21', '2025-07-22', '2025-07-23',
               '2025-07-24', '2025-07-25'
           ],
           labels=[
               '9日', '10日', '11日', '12日', '13日', '14日', '15日', '16日',
               '17日', '18日', '19日', '20日', '21日', '22日', '23日', '24日', '25日'
           ])

# 设置 y 轴的刻度位置和刻度标签
# rotation:标签旋转角度
# color:标签颜色
# fontsize:字体大小
# ticks:刻度位置
# labels:显示的标签(添加了温度单位 ℃)
plt.yticks(rotation=30,
           color='#09f',
           fontsize=10,
           ticks=[13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
           labels=['13℃', '14℃', '15℃', '16℃', '17℃', '18℃', '19℃', '20℃',
                   '21℃', '22℃', '23℃', '24℃', '25℃', '26℃'])

# 设置图表标题
plt.title(
    label='2025年7月8日至2025年7月25日的气温变化',  # 标题内容
    fontdict={'fontsize': 14, 'color': '#09f'},  # 字体样式:大小14,颜色为蓝色(#09f)
    loc='center',  # 标题对齐方式:居中
    pad=10,  # 标题与图表顶部的距离(以像素为单位)
    fontweight='bold',  # 字体加粗(此参数可被 fontdict 覆盖)
    color='red',  # 标题文字颜色(若设置,会覆盖 fontdict 中的颜色)
    backgroundcolor='lightblue'  # 设置标题背景颜色为浅蓝色
)

# 设置图例(legend)
plt.legend(
    labels=['最高气温', '最低气温'],  # 图例中显示的标签名称
    loc='lower left',  # 图例放置的位置:左下角
    ncol=1,  # 图例分为1列(纵向排列)
    title='天气温度',  # 图例的标题
    fontsize=10,  # 图例文字的字体大小
    frameon=True,  # 是否显示图例边框
    edgecolor='blue',  # 图例边框颜色
    facecolor='lightblue',  # 图例背景颜色
    shadow=True,  # 是否添加阴影效果
    fancybox=True  # 是否使用圆角边框(False 为直角)
)

# 设置图表网格线
plt.grid(
    visible=True,  # 是否显示网格线,设置为 True 表示显示网格线
    which='both',  # 应用于哪种刻度线('major' 主刻度,'minor' 次刻度,'both' 两者都应用)
    axis='both',  # 在哪个轴上显示网格线('x' x轴,'y' y轴,'both' 两个轴都显示)
    linestyle='--',  # 网格线的样式,这里是虚线
    color='lightblue',  # 网格线的颜色,这里设置为浅蓝色
    alpha=0.5,  # 网格线的透明度,范围是0到1,数值越低越透明
    linewidth=1,  # 网格线的宽度
    dashes=(5, 5)  # 虚线的样式,元组中的第一个数字表示实线部分长度,第二个数字表示间隔长度
)

# 显示图形
plt.show()

绘制的图形如下图所示:

在这里插入图片描述


五、参考线和参考区域

在数据可视化中,参考线(Reference Lines)参考区域(Reference Areas) 是非常有用的工具,可以突出显示特定的数据值、阈值或范围,从而增强图表的信息传达能力。

1. 参考线

1.1 水平参考线

使用 plt.axhline() 函数可以在图表中添加一条水平参考线。这条线会横跨整个绘图区域的宽度,并且可以设置其位置、颜色、样式等属性。

参数名 描述 示例
y 水平线的 y 轴位置(默认为 0) y=5
xmin 线条起始的 x 轴相对位置(0 到 1,左端为 0) xmin=0.2
xmax 线条结束的 x 轴相对位置(0 到 1,右端为 1) xmax=0.8
**kwargs 其他线条属性,如 color, linestyle, linewidth, label color='red', linestyle='--', linewidth=2

1.2 垂直参考线

使用 plt.axvline() 函数可以在图表中添加一条垂直参考线。这条线会纵贯整个绘图区域的高度。

参数名 描述 示例
x 垂直线的 x 轴位置(默认为 0) x=2.5
ymin 线条起始的 y 轴相对位置(0 到 1,底端为 0) ymin=0.2
ymax 线条结束的 y 轴相对位置(0 到 1,顶端为 1) ymax=0.8
**kwargs 其他线条属性,如 color, linestyle, linewidth, label color='blue', linestyle=':', linewidth=1.5

1.3 示例:绘制天气气温折线图

数据如下图所示,需要根据这个数据绘制气温折线图,并设置x轴和y轴的刻度范围和刻度标签、标题、图例、网格线和参考线。

在这里插入图片描述

实现代码如下所示:

from datetime import datetime

import matplotlib.pyplot as plt
import pandas as pd

# 设置中文字体为 SimHei(黑体),确保中文标签可以正常显示(可选)
plt.rcParams['font.sans-serif'] = ['SimHei']

# 解决负号 '-' 显示为方块的问题,保证负号正常显示
plt.rcParams['axes.unicode_minus'] = False

# 请将此处替换为你的CSV文件路径
csv_file_path = './data/气温.csv'
# 读取CSV文件
df = pd.read_csv(csv_file_path)

# 处理日期格式
df['日期'] = pd.to_datetime(df['日期'])

# 提取温度数值(去除℃符号并转换为整数)
df['最高气温'] = df['最高气温'].str.replace('℃', '').astype(int)
df['最低气温'] = df['最低气温'].str.replace('℃', '').astype(int)

# 绘制折线图
# plt.plot(df['日期'], df['最高气温'])
# plt.plot(df['日期'], df['最低气温'])
plt.plot('日期', '最高气温', data=df)
plt.plot('日期', '最低气温', data=df)

# 设置x轴日期格式,自动旋转日期标签
plt.gcf().autofmt_xdate()

# 设置 x 轴的标签(xlabel)
plt.xlabel(
    xlabel='日 期',  # 标签内容,显示为“日 期”
    fontdict={'fontsize': 12, 'color': '#000', 'fontweight': 'bold'},  # 设置字体样式:字体大小12,颜色为黑色,加粗
    labelpad=10,  # 标签与坐标轴之间的距离(以像素为单位)
    loc='center'  # 标签在 x 轴上的对齐方式,'center' 表示居中对齐
)

# 设置 y 轴的标签(ylabel)
plt.ylabel(
    ylabel='气 温',  # 标签内容,显示为“气 温”
    fontdict={'fontsize': 12, 'color': '#000', 'color': '#000', 'fontweight': 'bold'},  # 设置字体样式:字体大小12,颜色为黑色,加粗
    labelpad=5,  # 标签与坐标轴之间的距离(以像素为单位)
    loc='center'  # 标签在 y 轴上的对齐方式,'center' 表示居中对齐
)

# 设置 x 轴(时间)的显示范围
# 从 2025年7月8日 开始,到 2025年7月25日 结束
start_time = datetime(2025, 7, 8)
end_time = datetime(2025, 7, 25)

# 设置 x 轴的范围(时间范围)
plt.xlim((start_time, end_time))

# 设置 y 轴的数值范围,从 13 到 26
plt.ylim(ymin=13, ymax=26)

# 设置 x 轴的刻度位置和刻度标签
# rotation:刻度标签旋转角度(30度)
# color:刻度标签颜色(蓝色系)
# fontsize:字体大小
# ticks:指定刻度的位置(字符串日期)
# labels:对应每个刻度位置的显示标签(中文格式)
plt.xticks(rotation=30,
           color='#09f',
           fontsize=10,
           ticks=[
               '2025-07-09', '2025-07-10', '2025-07-11', '2025-07-12', '2025-07-13',
               '2025-07-14', '2025-07-15', '2025-07-16', '2025-07-17', '2025-07-18',
               '2025-07-19', '2025-07-20', '2025-07-21', '2025-07-22', '2025-07-23',
               '2025-07-24', '2025-07-25'
           ],
           labels=[
               '9日', '10日', '11日', '12日', '13日', '14日', '15日', '16日',
               '17日', '18日', '19日', '20日', '21日', '22日', '23日', '24日', '25日'
           ])

# 设置 y 轴的刻度位置和刻度标签
# rotation:标签旋转角度
# color:标签颜色
# fontsize:字体大小
# ticks:刻度位置
# labels:显示的标签(添加了温度单位 ℃)
plt.yticks(rotation=30,
           color='#09f',
           fontsize=10,
           ticks=[13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
           labels=['13℃', '14℃', '15℃', '16℃', '17℃', '18℃', '19℃', '20℃',
                   '21℃', '22℃', '23℃', '24℃', '25℃', '26℃'])

# 设置图表标题
plt.title(
    label='2025年7月8日至2025年7月25日的气温变化',  # 标题内容
    fontdict={'fontsize': 14, 'color': '#09f'},  # 字体样式:大小14,颜色为蓝色(#09f)
    loc='center',  # 标题对齐方式:居中
    pad=10,  # 标题与图表顶部的距离(以像素为单位)
    fontweight='bold',  # 字体加粗(此参数可被 fontdict 覆盖)
    color='red',  # 标题文字颜色(若设置,会覆盖 fontdict 中的颜色)
    backgroundcolor='lightblue'  # 设置标题背景颜色为浅蓝色
)

# 设置图表网格线
plt.grid(
    visible=True,  # 是否显示网格线,设置为 True 表示显示网格线
    which='both',  # 应用于哪种刻度线('major' 主刻度,'minor' 次刻度,'both' 两者都应用)
    axis='both',  # 在哪个轴上显示网格线('x' x轴,'y' y轴,'both' 两个轴都显示)
    linestyle='--',  # 网格线的样式,这里是虚线
    color='lightblue',  # 网格线的颜色,这里设置为浅蓝色
    alpha=0.5,  # 网格线的透明度,范围是0到1,数值越低越透明
    linewidth=1,  # 网格线的宽度
    dashes=(5, 5)  # 虚线的样式,元组中的第一个数字表示实线部分长度,第二个数字表示间隔长度
)

# 绘制一条水平直线,表示“最高气温”的平均值
plt.axhline(
    y=df['最高气温'].mean(),  # 水平线的 y 值,即最高气温的平均值
    color='red',  # 线条颜色为红色
    xmin=0.11,  # 线条起始位置(x轴左侧比例),0表示最左,1表示最右
    xmax=0.95,  # 线条结束位置(x轴右侧比例)
    linestyle='--',  # 线条样式为虚线
    linewidth=1,  # 线条宽度
    label='平均最高气温'  # 为该线条添加图例标签,后续调用 plt.legend() 时会显示
)

# 绘制另一条水平直线,表示“最低气温”的平均值
plt.axhline(
    y=df['最低气温'].mean(),  # 水平线的 y 值,即最低气温的平均值
    color='blue',  # 线条颜色为蓝色
    xmin=0.11,  # 同上,线条起始位置
    xmax=0.95,  # 同上,线条结束位置
    dashes=(5, 3),  # 自定义虚线样式,5像素实线 + 3像素空白
    linewidth=1,  # 线条宽度
    label='平均最低气温'  # 图例标签
)

# 绘制一条垂直直线,表示某个特定日期(2025年7月21日)
plt.axvline(
    x=datetime(2025, 7, 21),  # 垂直线的 x 值,这里是一个具体的日期(需要提前导入 datetime 模块)
    color='#b65',  # 使用十六进制颜色码定义线条颜色(一种橙色调)
    linestyle='--',  # 虚线样式
    label='2025-07-21'  # 图例标签
)

# 设置图例(legend)
plt.legend(
    labels=['最高气温', '最低气温', '平均最高气温', '平均最低气温', '2025-07-21'],  # 图例中显示的标签名称
    loc='lower left',  # 图例放置的位置:左下角
    ncol=3,  # 图例分为1列(纵向排列)
    title='天气温度',  # 图例的标题
    fontsize=10,  # 图例文字的字体大小
    frameon=True,  # 是否显示图例边框
    edgecolor='blue',  # 图例边框颜色
    facecolor='lightblue',  # 图例背景颜色
    shadow=True,  # 是否添加阴影效果
    fancybox=True  # 是否使用圆角边框(False 为直角)
)

# 显示图形
plt.show()

绘制的图形如下图所示:

在这里插入图片描述

2. 参考区域

参考区域(Reference Area)用于在图表中高亮显示某一范围,常用于突出显示数据的正常区间、异常区间或趋势变化区域。

2.1 水平参考区域

使用 plt.axhspan() 函数可以在图表中添加一个水平方向的矩形区域(即 y 轴方向上的高亮区域)。

参数名 描述 示例
ymin 区域下边界(y轴值) ymin=2
ymax 区域上边界(y轴值) ymax=4
xmin 区域起始的 x 轴比例位置(0 到 1) xmin=0.1
xmax 区域结束的 x 轴比例位置(0 到 1) xmax=0.9
color 区域填充颜色 color='yellow'
alpha 透明度(0 为完全透明,1 为不透明) alpha=0.3
zorder 层级顺序(数值越大越靠上) zorder=0
hatch 填充图案(如 '/', '\\', 'x' 等) hatch='//'

2.2 垂直参考区域

使用 plt.axvspan() 函数可以在图表中添加一个垂直方向的矩形区域(即 x 轴方向上的高亮区域)。

参数名 描述 示例
xmin 区域左边界(x轴值) xmin=1.5
xmax 区域右边界(x轴值) xmax=3.5
ymin 区域起始的 y 轴比例位置(0 到 1) ymin=0.1
ymax 区域结束的 y 轴比例位置(0 到 1) ymax=0.9
color 区域填充颜色 color='lightblue'
alpha 透明度 alpha=0.4
zorder 层级顺序 zorder=0
hatch 填充图案 hatch='x'

2.3 示例:绘制天气气温折线图

数据如下图所示,需要根据这个数据绘制气温折线图,并设置x轴和y轴的刻度范围和刻度标签、标题、图例、网格线、参考线和参考区域。

在这里插入图片描述

实现代码如下所示:

from datetime import datetime

import matplotlib.pyplot as plt
import pandas as pd

# 设置中文字体为 SimHei(黑体),确保中文标签可以正常显示(可选)
plt.rcParams['font.sans-serif'] = ['SimHei']

# 解决负号 '-' 显示为方块的问题,保证负号正常显示
plt.rcParams['axes.unicode_minus'] = False

# 请将此处替换为你的CSV文件路径
csv_file_path = './data/气温.csv'
# 读取CSV文件
df = pd.read_csv(csv_file_path)

# 处理日期格式
df['日期'] = pd.to_datetime(df['日期'])

# 提取温度数值(去除℃符号并转换为整数)
df['最高气温'] = df['最高气温'].str.replace('℃', '').astype(int)
df['最低气温'] = df['最低气温'].str.replace('℃', '').astype(int)

# 绘制折线图
# plt.plot(df['日期'], df['最高气温'])
# plt.plot(df['日期'], df['最低气温'])
plt.plot('日期', '最高气温', data=df)
plt.plot('日期', '最低气温', data=df)

# 设置x轴日期格式,自动旋转日期标签
plt.gcf().autofmt_xdate()

# 设置 x 轴的标签(xlabel)
plt.xlabel(
    xlabel='日 期',  # 标签内容,显示为“日 期”
    fontdict={'fontsize': 12, 'color': '#000', 'fontweight': 'bold'},  # 设置字体样式:字体大小12,颜色为黑色,加粗
    labelpad=10,  # 标签与坐标轴之间的距离(以像素为单位)
    loc='center'  # 标签在 x 轴上的对齐方式,'center' 表示居中对齐
)

# 设置 y 轴的标签(ylabel)
plt.ylabel(
    ylabel='气 温',  # 标签内容,显示为“气 温”
    fontdict={'fontsize': 12, 'color': '#000', 'color': '#000', 'fontweight': 'bold'},  # 设置字体样式:字体大小12,颜色为黑色,加粗
    labelpad=5,  # 标签与坐标轴之间的距离(以像素为单位)
    loc='center'  # 标签在 y 轴上的对齐方式,'center' 表示居中对齐
)

# 设置 x 轴(时间)的显示范围
# 从 2025年7月8日 开始,到 2025年7月25日 结束
start_time = datetime(2025, 7, 8)
end_time = datetime(2025, 7, 25)

# 设置 x 轴的范围(时间范围)
plt.xlim((start_time, end_time))

# 设置 y 轴的数值范围,从 13 到 26
plt.ylim(ymin=13, ymax=26)

# 设置 x 轴的刻度位置和刻度标签
# rotation:刻度标签旋转角度(30度)
# color:刻度标签颜色(蓝色系)
# fontsize:字体大小
# ticks:指定刻度的位置(字符串日期)
# labels:对应每个刻度位置的显示标签(中文格式)
plt.xticks(rotation=30,
           color='#09f',
           fontsize=10,
           ticks=[
               '2025-07-09', '2025-07-10', '2025-07-11', '2025-07-12', '2025-07-13',
               '2025-07-14', '2025-07-15', '2025-07-16', '2025-07-17', '2025-07-18',
               '2025-07-19', '2025-07-20', '2025-07-21', '2025-07-22', '2025-07-23',
               '2025-07-24', '2025-07-25'
           ],
           labels=[
               '9日', '10日', '11日', '12日', '13日', '14日', '15日', '16日',
               '17日', '18日', '19日', '20日', '21日', '22日', '23日', '24日', '25日'
           ])

# 设置 y 轴的刻度位置和刻度标签
# rotation:标签旋转角度
# color:标签颜色
# fontsize:字体大小
# ticks:刻度位置
# labels:显示的标签(添加了温度单位 ℃)
plt.yticks(rotation=30,
           color='#09f',
           fontsize=10,
           ticks=[13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
           labels=['13℃', '14℃', '15℃', '16℃', '17℃', '18℃', '19℃', '20℃',
                   '21℃', '22℃', '23℃', '24℃', '25℃', '26℃'])

# 设置图表标题
plt.title(
    label='2025年7月8日至2025年7月25日的气温变化',  # 标题内容
    fontdict={'fontsize': 14, 'color': '#09f'},  # 字体样式:大小14,颜色为蓝色(#09f)
    loc='center',  # 标题对齐方式:居中
    pad=10,  # 标题与图表顶部的距离(以像素为单位)
    fontweight='bold',  # 字体加粗(此参数可被 fontdict 覆盖)
    color='red',  # 标题文字颜色(若设置,会覆盖 fontdict 中的颜色)
    backgroundcolor='lightblue'  # 设置标题背景颜色为浅蓝色
)

# 设置图表网格线
plt.grid(
    visible=True,  # 是否显示网格线,设置为 True 表示显示网格线
    which='both',  # 应用于哪种刻度线('major' 主刻度,'minor' 次刻度,'both' 两者都应用)
    axis='both',  # 在哪个轴上显示网格线('x' x轴,'y' y轴,'both' 两个轴都显示)
    linestyle='--',  # 网格线的样式,这里是虚线
    color='lightblue',  # 网格线的颜色,这里设置为浅蓝色
    alpha=0.5,  # 网格线的透明度,范围是0到1,数值越低越透明
    linewidth=1,  # 网格线的宽度
    dashes=(5, 5)  # 虚线的样式,元组中的第一个数字表示实线部分长度,第二个数字表示间隔长度
)

# 绘制一条水平直线,表示“最高气温”的平均值
plt.axhline(
    y=df['最高气温'].mean(),  # 水平线的 y 值,即最高气温的平均值
    color='red',  # 线条颜色为红色
    xmin=0.11,  # 线条起始位置(x轴左侧比例),0表示最左,1表示最右
    xmax=0.95,  # 线条结束位置(x轴右侧比例)
    linestyle='--',  # 线条样式为虚线
    linewidth=1,  # 线条宽度
    label='平均最高气温'  # 为该线条添加图例标签,后续调用 plt.legend() 时会显示
)

# 绘制另一条水平直线,表示“最低气温”的平均值
plt.axhline(
    y=df['最低气温'].mean(),  # 水平线的 y 值,即最低气温的平均值
    color='blue',  # 线条颜色为蓝色
    xmin=0.11,  # 同上,线条起始位置
    xmax=0.95,  # 同上,线条结束位置
    dashes=(5, 3),  # 自定义虚线样式,5像素实线 + 3像素空白
    linewidth=1,  # 线条宽度
    label='平均最低气温'  # 图例标签
)

# 绘制一条垂直直线,表示某个特定日期(2025年7月21日)
plt.axvline(
    x=datetime(2025, 7, 21),  # 垂直线的 x 值,这里是一个具体的日期(需要提前导入 datetime 模块)
    color='#b65',  # 使用十六进制颜色码定义线条颜色(一种橙色调)
    linestyle='--',  # 虚线样式
    label='2025-07-21'  # 图例标签
)

# 设置图例(legend)
plt.legend(
    labels=['最高气温', '最低气温', '平均最高气温', '平均最低气温', '2025-07-21'],  # 图例中显示的标签名称
    loc='lower left',  # 图例放置的位置:左下角
    ncol=3,  # 图例分为1列(纵向排列)
    title='天气温度',  # 图例的标题
    fontsize=10,  # 图例文字的字体大小
    frameon=True,  # 是否显示图例边框
    edgecolor='blue',  # 图例边框颜色
    facecolor='lightblue',  # 图例背景颜色
    shadow=True,  # 是否添加阴影效果
    fancybox=True  # 是否使用圆角边框(False 为直角)
)

# 绘制一个水平方向的跨度(矩形区域),表示特定范围内的气温区间
plt.axhspan(
    ymin=23,                        # 矩形区域下边界的 y 值(此处为温度)
    ymax=24.5,                      # 矩形区域上边界的 y 值
    xmin=0.1,                       # 矩形区域左边界的 x 轴比例(从x轴起点开始的比例)
    xmax=0.95,                      # 矩形区域右边界的 x 轴比例(到x轴终点的比例)
    color='lightblue',              # 区域填充颜色
    alpha=0.6,                      # 透明度,范围是0到1,数值越小越透明
    zorder=0,                       # 图层顺序,值越小越靠后,默认背景层级
    hatch='///'                     # 填充模式,这里使用斜线填充
)

# 绘制一个垂直方向的跨度(矩形区域),强调特定时间段
plt.axvspan(
    xmin=datetime(2025, 7, 20),     # 矩形区域左边界的时间点(起始日期时间)
    xmax=datetime(2025, 7, 22),     # 矩形区域右边界的时间点(结束日期时间)需要导入 datetime 模块
    ymin=0.05,                      # 矩形区域下边界的 y 轴比例(从y轴起点开始的比例)
    ymax=0.96,                      # 矩形区域上边界的 y 轴比例(到y轴终点的比例)
    color='lightblue',              # 区域填充颜色
    alpha=0.6,                      # 透明度
    zorder=0,                       # 图层顺序
    hatch='///'                     # 填充模式,这里使用斜线填充
)

# 显示图形
plt.show()

绘制的图形如下图所示:

在这里插入图片描述


当然可以!以下是 “注释文本” 部分的完整内容,包含:

  • 6.1 指向型注释文本:使用 plt.annotate() 方法;
  • 6.2 无指向型注释文本:使用 plt.text() 方法;

每个方法都配有详细的 参数说明表格示例代码,帮助你掌握如何在图表中添加文字注释。


六、注释文本

在 Matplotlib 中,注释文本 是一种用于在图表中添加说明性文字的方式,可以用于标注关键点、解释趋势或强调特定区域。

1. 指向型注释文本

使用 plt.annotate() 函数可以添加一个带有箭头指向的注释文本,非常适合标注图表中的特定数据点。

参数名 描述 示例
text 注释文本内容 '最大值'
xy 被注释点的坐标(x, y) (2, 4)
xytext 注释文本的位置坐标 (30, 40)
xycoords 被注释点坐标的参考系 'data', 'axes fraction'
textcoords 注释文本位置的参考系 'offset points', 'data'
arrowprops 箭头属性字典 dict(arrowstyle='->', color='red')
fontsize 字体大小 10
color 文字颜色 'blue'
ha 水平对齐方式('left', 'center', 'right' 'center'
va 垂直对齐方式('top', 'center', 'bottom' 'bottom'

arrowstyle的参数取值及对应的样式:

取值 样式
-
<-
->
<->
<|-
-->
<|- >
fancy
]- ]–
-[ –[
]-[ ]–[
|-
]-> ]→
<-[ ←[
simple
wedge

2. 无指向型注释文本

使用 plt.text() 函数可以添加一个不带箭头的注释文本,用于在图表的指定位置添加静态说明性文字。

参数名 描述 示例
x, y 注释文本的位置坐标(数据坐标) x=2, y=10
s 注释文本内容 '注意区域'
fontdict 字体字典,控制字体样式 {'size': 12, 'color': 'green'}
fontsize 字体大小 10
color 文字颜色 'purple'
rotation 文字旋转角度 45
ha 水平对齐方式('left', 'center', 'right' 'center'
va 垂直对齐方式('top', 'center', 'bottom' 'bottom'

3. 示例:绘制天气气温折线图

数据如下图所示,需要根据这个数据绘制气温折线图,并设置x轴和y轴的刻度范围和刻度标签、标题、图例、网格线、参考线、参考区域和注释文本。

在这里插入图片描述

实现代码如下所示:

from datetime import datetime

import matplotlib.pyplot as plt
import pandas as pd

# 设置中文字体为 SimHei(黑体),确保中文标签可以正常显示(可选)
plt.rcParams['font.sans-serif'] = ['SimHei']

# 解决负号 '-' 显示为方块的问题,保证负号正常显示
plt.rcParams['axes.unicode_minus'] = False

# 请将此处替换为你的CSV文件路径
csv_file_path = './data/气温.csv'
# 读取CSV文件
df = pd.read_csv(csv_file_path)

# 处理日期格式
df['日期'] = pd.to_datetime(df['日期'])

# 提取温度数值(去除℃符号并转换为整数)
df['最高气温'] = df['最高气温'].str.replace('℃', '').astype(int)
df['最低气温'] = df['最低气温'].str.replace('℃', '').astype(int)

# 绘制折线图
# plt.plot(df['日期'], df['最高气温'])
# plt.plot(df['日期'], df['最低气温'])
plt.plot('日期', '最高气温', data=df)
plt.plot('日期', '最低气温', data=df)

# 设置x轴日期格式,自动旋转日期标签
plt.gcf().autofmt_xdate()

# 设置 x 轴的标签(xlabel)
plt.xlabel(
    xlabel='日 期',  # 标签内容,显示为“日 期”
    fontdict={'fontsize': 12, 'color': '#000', 'fontweight': 'bold'},  # 设置字体样式:字体大小12,颜色为黑色,加粗
    labelpad=10,  # 标签与坐标轴之间的距离(以像素为单位)
    loc='center'  # 标签在 x 轴上的对齐方式,'center' 表示居中对齐
)

# 设置 y 轴的标签(ylabel)
plt.ylabel(
    ylabel='气 温',  # 标签内容,显示为“气 温”
    fontdict={'fontsize': 12, 'color': '#000', 'color': '#000', 'fontweight': 'bold'},  # 设置字体样式:字体大小12,颜色为黑色,加粗
    labelpad=5,  # 标签与坐标轴之间的距离(以像素为单位)
    loc='center'  # 标签在 y 轴上的对齐方式,'center' 表示居中对齐
)

# 设置 x 轴(时间)的显示范围
# 从 2025年7月8日 开始,到 2025年7月25日 结束
start_time = datetime(2025, 7, 8)
end_time = datetime(2025, 7, 25)

# 设置 x 轴的范围(时间范围)
plt.xlim((start_time, end_time))

# 设置 y 轴的数值范围,从 13 到 26
plt.ylim(ymin=13, ymax=26)

# 设置 x 轴的刻度位置和刻度标签
# rotation:刻度标签旋转角度(30度)
# color:刻度标签颜色(蓝色系)
# fontsize:字体大小
# ticks:指定刻度的位置(字符串日期)
# labels:对应每个刻度位置的显示标签(中文格式)
plt.xticks(rotation=30,
           color='#09f',
           fontsize=10,
           ticks=[
               '2025-07-09', '2025-07-10', '2025-07-11', '2025-07-12', '2025-07-13',
               '2025-07-14', '2025-07-15', '2025-07-16', '2025-07-17', '2025-07-18',
               '2025-07-19', '2025-07-20', '2025-07-21', '2025-07-22', '2025-07-23',
               '2025-07-24', '2025-07-25'
           ],
           labels=[
               '9日', '10日', '11日', '12日', '13日', '14日', '15日', '16日',
               '17日', '18日', '19日', '20日', '21日', '22日', '23日', '24日', '25日'
           ])

# 设置 y 轴的刻度位置和刻度标签
# rotation:标签旋转角度
# color:标签颜色
# fontsize:字体大小
# ticks:刻度位置
# labels:显示的标签(添加了温度单位 ℃)
plt.yticks(rotation=30,
           color='#09f',
           fontsize=10,
           ticks=[13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
           labels=['13℃', '14℃', '15℃', '16℃', '17℃', '18℃', '19℃', '20℃',
                   '21℃', '22℃', '23℃', '24℃', '25℃', '26℃'])

# 设置图表标题
plt.title(
    label='2025年7月8日至2025年7月25日的气温变化',  # 标题内容
    fontdict={'fontsize': 14, 'color': '#09f'},  # 字体样式:大小14,颜色为蓝色(#09f)
    loc='center',  # 标题对齐方式:居中
    pad=10,  # 标题与图表顶部的距离(以像素为单位)
    fontweight='bold',  # 字体加粗(此参数可被 fontdict 覆盖)
    color='red',  # 标题文字颜色(若设置,会覆盖 fontdict 中的颜色)
    backgroundcolor='lightblue'  # 设置标题背景颜色为浅蓝色
)

# 设置图表网格线
plt.grid(
    visible=True,  # 是否显示网格线,设置为 True 表示显示网格线
    which='both',  # 应用于哪种刻度线('major' 主刻度,'minor' 次刻度,'both' 两者都应用)
    axis='both',  # 在哪个轴上显示网格线('x' x轴,'y' y轴,'both' 两个轴都显示)
    linestyle='--',  # 网格线的样式,这里是虚线
    color='lightblue',  # 网格线的颜色,这里设置为浅蓝色
    alpha=0.5,  # 网格线的透明度,范围是0到1,数值越低越透明
    linewidth=1,  # 网格线的宽度
    dashes=(5, 5)  # 虚线的样式,元组中的第一个数字表示实线部分长度,第二个数字表示间隔长度
)

# 绘制一条水平直线,表示“最高气温”的平均值
plt.axhline(
    y=df['最高气温'].mean(),  # 水平线的 y 值,即最高气温的平均值
    color='red',  # 线条颜色为红色
    xmin=0.11,  # 线条起始位置(x轴左侧比例),0表示最左,1表示最右
    xmax=0.95,  # 线条结束位置(x轴右侧比例)
    linestyle='--',  # 线条样式为虚线
    linewidth=1,  # 线条宽度
    label='平均最高气温'  # 为该线条添加图例标签,后续调用 plt.legend() 时会显示
)

# 绘制另一条水平直线,表示“最低气温”的平均值
plt.axhline(
    y=df['最低气温'].mean(),  # 水平线的 y 值,即最低气温的平均值
    color='blue',  # 线条颜色为蓝色
    xmin=0.11,  # 同上,线条起始位置
    xmax=0.95,  # 同上,线条结束位置
    dashes=(5, 3),  # 自定义虚线样式,5像素实线 + 3像素空白
    linewidth=1,  # 线条宽度
    label='平均最低气温'  # 图例标签
)

# 绘制一条垂直直线,表示某个特定日期(2025年7月21日)
plt.axvline(
    x=datetime(2025, 7, 21),  # 垂直线的 x 值,这里是一个具体的日期(需要提前导入 datetime 模块)
    color='#b65',  # 使用十六进制颜色码定义线条颜色(一种橙色调)
    linestyle='--',  # 虚线样式
    label='2025-07-21'  # 图例标签
)

# 设置图例(legend)
plt.legend(
    labels=['最高气温', '最低气温', '平均最高气温', '平均最低气温', '2025-07-21'],  # 图例中显示的标签名称
    loc='lower left',  # 图例放置的位置:左下角
    ncol=3,  # 图例分为1列(纵向排列)
    title='天气温度',  # 图例的标题
    fontsize=10,  # 图例文字的字体大小
    frameon=True,  # 是否显示图例边框
    edgecolor='blue',  # 图例边框颜色
    facecolor='lightblue',  # 图例背景颜色
    shadow=True,  # 是否添加阴影效果
    fancybox=True  # 是否使用圆角边框(False 为直角)
)

# 绘制一个水平方向的跨度(矩形区域),表示特定范围内的气温区间
plt.axhspan(
    ymin=23,  # 矩形区域下边界的 y 值(此处为温度)
    ymax=24.5,  # 矩形区域上边界的 y 值
    xmin=0.1,  # 矩形区域左边界的 x 轴比例(从x轴起点开始的比例)
    xmax=0.95,  # 矩形区域右边界的 x 轴比例(到x轴终点的比例)
    color='lightblue',  # 区域填充颜色
    alpha=0.6,  # 透明度,范围是0到1,数值越小越透明
    zorder=0,  # 图层顺序,值越小越靠后,默认背景层级
    hatch='///'  # 填充模式,这里使用斜线填充
)

# 绘制一个垂直方向的跨度(矩形区域),强调特定时间段
plt.axvspan(
    xmin=datetime(2025, 7, 20),  # 矩形区域左边界的时间点(起始日期时间)
    xmax=datetime(2025, 7, 22),  # 矩形区域右边界的时间点(结束日期时间)需要导入 datetime 模块
    ymin=0.05,  # 矩形区域下边界的 y 轴比例(从y轴起点开始的比例)
    ymax=0.96,  # 矩形区域上边界的 y 轴比例(到y轴终点的比例)
    color='lightblue',  # 区域填充颜色
    alpha=0.6,  # 透明度
    zorder=0,  # 图层顺序
    hatch='///'  # 填充模式,这里使用斜线填充
)

# 获取数据框中“最高气温”列的最小值,并将其赋值给min_temp变量
min_temp = df['最高气温'].min()

# 筛选出“最高气温”等于min_temp的所有行,并获取对应的第一行的“日期”列值,然后转换为日期格式
target_date = pd.to_datetime(df[df['最高气温'] == min_temp]['日期'].iloc[0])

# 在图表上添加注解,指示最高气温的最小值及其对应的日期
plt.annotate(
    text='最高气温最小值',  # 注解文本内容
    xy=(target_date, min_temp),  # 注解箭头指向的位置(x,y)
    xytext=(target_date, 19.5),  # 注解文本位置(x,y)
    arrowprops=dict(arrowstyle='->', color='blue', alpha=0.8),  # 箭头属性
    fontsize=10,  # 文本大小
    color='blue',  # 文本颜色
    alpha=0.8,  # 文本透明度
    ha='center',  # 水平对齐方式
    va='center'  # 垂直对齐方式
)

# 计算“最高气温”的平均值并四舍五入保留一位小数
max_temp_avg = df['最高气温'].mean().round(1)

# 在指定位置添加文本,显示最高气温的平均值
plt.text(
    x=datetime(2025, 7, 22),  # 文本x坐标
    y=max_temp_avg,  # 文本y坐标
    s=f'avg:{max_temp_avg}°C',  # 文本内容
    fontsize=10,  # 文本大小
    color='red',  # 文本颜色
    # rotation=45,  # 可选:文本旋转角度,默认不旋转
    alpha=0.8,  # 文本透明度
    ha='left',  # 水平对齐方式
    va='bottom'  # 垂直对齐方式
)

# 将数据框中的“日期”列转换为datetime类型列表,方便后续绘图使用
x_temp = pd.to_datetime(df['日期']).tolist()

# 获取“最高气温”列的值,并加上温度单位°C形成新列表
y_temp = df['最高气温'].tolist()
y_temp_with_unit = [f"{temp}°C" for temp in y_temp]
for i in range(len(y_temp_with_unit)):
    # 对每个最高气温值添加标注,显示其具体数值和单位
    plt.text(
        x=x_temp[i],  # 文本x坐标
        y=y_temp[i],  # 文本y坐标
        s=y_temp_with_unit[i],  # 文本内容
        fontsize=10,  # 文本大小
        color='#000',  # 文本颜色
        rotation=30,  # 文本旋转角度
        ha='left',  # 水平对齐方式
        va='bottom'  # 垂直对齐方式
    )

# 同样处理最低气温的数据,并在图表上标注
y_temp = df['最低气温'].tolist()
y_temp_with_unit = [f"{temp}°C" for temp in y_temp]
for i in range(len(y_temp_with_unit)):
    plt.text(
        x=x_temp[i],  # 文本x坐标
        y=y_temp[i],  # 文本y坐标
        s=y_temp_with_unit[i],  # 文本内容
        fontsize=10,  # 文本大小
        color='#000',  # 文本颜色
        rotation=30,  # 文本旋转角度
        ha='left',  # 水平对齐方式
        va='bottom'  # 垂直对齐方式
    )

# 显示图形
plt.show()

绘制的图形如下图所示:

在这里插入图片描述


七、表格

1. 表格

在 Matplotlib 中,可以使用 plt.table()Axes.table() 方法在图表中添加一个数据表格。该功能常用于将图表与原始数据结合展示,增强信息表达。

参数名 类型 描述 示例值
cellText 2D list 或 2D 数组 表格主体数据(每个单元格的文本),形状为 (n_rows, n_cols) [['A', 'B'], ['1', '2']]
cellColours 2D list of colors 每个单元格的背景颜色,形状与 cellText 相同 [['red', 'green'], ['yellow', 'blue']]
cellLoc str(可选) 单元格文本的对齐方式:'left', 'center', 'right' 'center'
colWidths list of floats(可选) 每列的相对宽度(比例) [0.2, 0.2, 0.2]
rowLabels list(长度 = n_rows) 每行左侧的标签 ['Row1', 'Row2']
rowColours list of colors 每行标签的背景色 ['lightgray', 'white']
rowLoc str(可选) 行标签的文本对齐方式 'right'
colLabels list(长度 = n_cols) 每列顶部的列名 ['ColA', 'ColB']
colColours list of colors 每列标题的背景颜色 ['lightblue'] * 3
colLoc str(可选) 列标签的文本对齐方式 'center'
loc str 或 4-tuple 表格在图表中的位置(如 'top', 'bottom', 'center')或自定义位置 'bottom', (0.1, 0.1, 0.8, 0.5)
bbox [left, bottom, width, height] 以坐标形式指定表格位置和大小(归一化坐标 0~1) [0.1, 0.1, 0.8, 0.5]
edges str 控制单元格边框显示:
'closed':全部边框
'open':无边框
'horizontal' / 'vertical'
'B', 'T', 'L', 'R':仅显示某边
'closed'
**kwargs 其他属性 fontsize, alpha, zorder fontsize=10, alpha=0.9

2. 示例:绘制国内生产总值柱形图

数据如下图所示,需要根据这个数据绘制国内生产总值柱形图,并显示数据。

在这里插入图片描述

实现代码如下图所示:

# 导入 matplotlib.pyplot 模块,用于绘图
import matplotlib.pyplot as plt

# 导入 numpy 模块,用于数值计算,这里主要用于生成数组
import numpy as np

# 导入 pandas 模块,用于数据处理,特别是读取和操作 CSV 文件
import pandas as pd

# 用来正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决负号'-'显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False

# 定义 CSV 文件的路径(请根据实际情况修改路径)
csv_file_path = './data/国内生成总值.csv'

# 使用 pandas 的 read_csv 函数读取 CSV 文件,并将数据存储在一个 DataFrame 对象中
df = pd.read_csv(csv_file_path)

# 使用 numpy 的 arange 函数生成一个从 0 到 len(df)-1 的数组,表示柱状图中每个柱子的 x 轴位置
x = np.arange(len(df))

# 从 DataFrame 中提取 '年份' 列,作为 x 轴的刻度标签
tick_label = df['年份'].apply(lambda x1: str(x1) + '年')

# 从 DataFrame 中提取 '生产总值' 列,作为柱状图中每个柱子的高度
height = df['生产总值']

# 绘制柱状图:
# - x: 每个柱子在 x 轴上的位置(基于之前生成的数组)
# - height: 指定为 '生产总值',表示从 data 参数中提取该列作为柱子的高度
# - width: 设置柱子的宽度为 0.5
# - tick_label: 指定为 '年份',表示从 data 参数中提取该列作为 x 轴的刻度标签
# - data: 传入之前读取的 DataFrame,作为绘图的数据源
# plt.bar(x=x, height='生产总值', width=0.5, tick_label='年份', data=df)
plt.bar(x=x, height=height, width=0.5, tick_label=tick_label)

# 将 DataFrame 中的数据部分(所有行和列)提取为 NumPy 数组,作为表格的单元格内容
table_data = df.values

# 获取 DataFrame 的列名,作为表格的列标题
col_labels = df.columns

# 使用 matplotlib 的 plt.table() 在图表中绘制一个表格
table = plt.table(
    cellText=table_data,  # 表格每个单元格要显示的文本数据(二维数组)
    cellLoc='center',  # 单元格内文字的对齐方式,'center' 表示居中
    colWidths=[0.3, 0.3],  # 每一列的宽度(相对宽度),这里两列各占 0.3
    colLabels=col_labels,  # 列标题(表头),从 df.columns 获取
    colColours=['lightblue', 'lightblue'],  # 列标题背景颜色,这里两列都设为浅蓝色
    colLoc='center',  # 列标题文字的对齐方式,居中显示
    loc='lower left',  # 表格在图表中的位置,'lower left' 表示左下角
    edges='BT',  # 控制单元格边框的显示方式:
    # 'B' = 底部边框(Bottom)
    # 'T' = 顶部边框(Top)
    # 'L' = 左侧边框(Left)
    # 'R' = 右侧边框(Right)
    # 这里只显示上下边框,左右无边框
    zorder=1  # 图层顺序,值越大越在上层。设为1表示表格显示在数据图层之上
)

# 显示绘制完成的图表
plt.show()

绘制的图形如下图所示:

在这里插入图片描述


八、数据及代码下载地址

下载地址:https://download.csdn.net/download/zcs2312852665/91529326


网站公告

今日签到

点亮在社区的每一天
去签到