Matplotlib(三)- 图表辅助元素
文章目录
- 一、图表辅助元素简介
- 二、坐标轴的标签、刻度范围和刻度标签
- 1. 坐标轴标签
- 1.1 x轴标签
- 1.2 y轴标签
- 1.3 示例:绘制天气气温折线图
- 2. 刻度范围和刻度标签
- 2.1 刻度范围
- 2.1.1 x轴刻度范围
- 2.1.2 y轴刻度范围
- 2.2 刻度标签
- 2.2.1 x轴刻度标签
- 2.2.2 y轴刻度标签
- 2.3 示例:绘制天气气温折线图
- 三、标题和图例
- 1. 标题(Title)
- 2. 图例(Legend)
- 3 示例:绘制天气气温折线图
- 4. 示例:绘制账单饼图
- 四、网格
- 1. 网格
- 2. 示例:绘制天气气温折线图
- 五、参考线和参考区域
- 1. 参考线
- 1.1 水平参考线
- 1.2 垂直参考线
- 1.3 示例:绘制天气气温折线图
- 2. 参考区域
- 2.1 水平参考区域
- 2.2 垂直参考区域
- 2.3 示例:绘制天气气温折线图
- 六、注释文本
- 1. 指向型注释文本
- 2. 无指向型注释文本
- 3. 示例:绘制天气气温折线图
- 七、表格
- 1. 表格
- 2. 示例:绘制国内生产总值柱形图
- 八、数据及代码下载地址
一、图表辅助元素简介
在数据可视化中,除了核心的图表内容(如折线、柱形、散点等),辅助元素是提升图表可读性、信息完整性和美观度的关键组成部分。它们能够帮助读者快速理解图表的主题、数据含义、坐标轴范围以及数据间的关联,是专业图表不可或缺的一部分。
常见的图表辅助元素包括以下几类:
辅助元素类别 | 作用描述 | 典型使用场景 | 示例代码(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 | 其他文本属性,如 color 、fontsize 、rotation 等 |
1.2 y轴标签
使用 plt.ylabel()
函数可以为 y轴 添加标签。
参数名 | 描述 |
---|---|
ylabel | 要显示的标签文本(字符串) |
fontdict | 字体字典,用于设置字体大小、颜色、样式等 |
labelpad | 标签与坐标轴之间的距离(像素) |
loc | 标签的位置,可选 'center' 、'top' 、'bottom' |
**kwargs | 其他文本属性,如 color 、fontsize 、rotation 等 |
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 datetimeimport 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 datetimeimport 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 | 开启或关闭网格 | True 或 False | 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 datetimeimport 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 datetimeimport 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 datetimeimport 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 datetimeimport 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.3colLabels=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