一、图表辅助元素简介
在数据可视化中,除了核心的图表内容(如折线、柱形、散点等),辅助元素是提升图表可读性、信息完整性和美观度的关键组成部分。它们能够帮助读者快速理解图表的主题、数据含义、坐标轴范围以及数据间的关联,是专业图表不可或缺的一部分。
常见的图表辅助元素包括以下几类:
辅助元素类别 | 作用描述 | 典型使用场景 | 示例代码(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 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 |
开启或关闭网格 | 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 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