文章目录
- 一、坐标轴概述
- 1. 坐标轴介绍
- 2. 坐标轴相关属性
- 二、坐标轴
- 1. axes() 方法介绍
- 2. 示例:添加多个绘图区域
- 三、坐标轴的刻度
- 1. 坐标轴的刻度介绍
- 2. 刻度定位器和格式器
- 2.1 刻度定位器
- 2.2 刻度格式器
- 2.3 示例:刻度定位和格式
- 3. 刻度样式
- 3.1 tick_params()方法介绍
- 3.2 示例:刻度样式
- 4. 示例:某地区24小时的平均风速
- 四、轴脊(Spines)
- 1. 轴脊介绍
- 2. 隐藏轴脊
- 2.1 通过 axis() 方法
- 2.2 通过 `set_visible()` 方法
- 2.3 示例:绘制多边形(隐藏轴脊)
- 2.4 示例:2018年到2022年的快递业务量及其增长速度
- 3. 移动轴脊
- 3.1 通过 set_position() 方法
- 3.2 示例:绘制多边形(移动轴脊)
一、坐标轴概述
在 Matplotlib 中,坐标轴(Axes) 是绘图的核心区域,它是图形中实际绘制数据的部分,包含刻度、标签、网格线以及数据曲线等元素。一个 Figure
(画布)可以包含一个或多个 Axes
(子图),每个 Axes
都拥有独立的 x 轴和 y 轴(在三维图中还包括 z 轴)。
1. 坐标轴介绍
Axes
并不是简单的“坐标轴线”,而是指图表中的绘图区域,包括:
- X 轴和 Y 轴:定义数据的数值尺度;
- 刻度(Ticks):坐标轴上的标记点;
- 刻度标签(Tick Labels):刻度对应的数值或文字说明;
- 轴标签(Axis Labels):描述坐标轴含义的文字(如“时间”、“温度”);
- 标题(Title):子图的标题;
- 图例(Legend):用于标识不同数据系列;
- 网格线(Grid):辅助读数的背景线。
🔹 注意:不要将
Axes
与Axis
混淆:
Axes
:整个绘图区域(可理解为“子图”);Axis
:单个坐标轴对象(如 x 轴或 y 轴),是Axes
的组成部分。
2. 坐标轴相关属性
以下是 Matplotlib 中 Axes
和其子对象(如 Axis
、Tick
)常用属性的详细说明表:
属性 | 类型 | 获取方式 | 描述 |
---|---|---|---|
ax.xaxis | matplotlib.axis.XAxis | ax.xaxis | X 轴对象,控制 x 轴的刻度、标签、方向等 |
ax.yaxis | matplotlib.axis.YAxis | ax.yaxis | Y 轴对象,控制 y 轴的刻度、标签、方向等 |
ax.xaxis.label | Text | ax.xaxis.label | X 轴标签文本对象 |
ax.yaxis.label | Text | ax.yaxis.label | Y 轴标签文本对象 |
ax.title | Text | ax.title | 子图标题对象 |
ax.xaxis.get_ticklocs() / get_ticks() | array | ax.xaxis.get_ticklocs() | 获取 x 轴刻度位置 |
ax.yaxis.get_ticklocs() / get_ticks() | array | ax.yaxis.get_ticklocs() | 获取 y 轴刻度位置 |
ax.xaxis.get_ticklabels() | list of Text | ax.xaxis.get_ticklabels() | 获取 x 轴刻度标签对象列表 |
ax.yaxis.get_ticklabels() | list of Text | ax.yaxis.get_ticklabels() | 获取 y 轴刻度标签对象列表 |
ax.xaxis.set_ticks() | 方法 | ax.xaxis.set_ticks(ticks) | 设置 x 轴刻度位置 |
ax.yaxis.set_ticks() | 方法 | ax.yaxis.set_ticks(ticks) | 设置 y 轴刻度位置 |
ax.xaxis.set_ticklabels() | 方法 | ax.xaxis.set_ticklabels(labels) | 设置 x 轴刻度标签 |
ax.yaxis.set_ticklabels() | 方法 | ax.yaxis.set_ticklabels(labels) | 设置 y 轴刻度标签 |
ax.grid() | 方法 | ax.grid(True) | 显示网格线 |
ax.set_xlim() / ax.set_ylim() | 方法 | ax.set_xlim(left, right) | 设置坐标轴数据范围 |
ax.set_xlabel() / ax.set_ylabel() | 方法 | ax.set_xlabel('文本') | 设置坐标轴标签 |
ax.set_title() | 方法 | ax.set_title('标题') | 设置子图标题 |
ax.spines | Spines 字典 | ax.spines['left'] | 控制坐标轴边框(如左、右、上、下 spine)的显示与样式 |
二、坐标轴
1. axes() 方法介绍
在 Matplotlib 中,plt.axes()
方法用于向当前图形(figure)中添加一个新的坐标轴(Axes)。这个方法提供了非常灵活的方式来定义新的绘图区域的位置和大小,也可以用来创建具有不同坐标系的子图。通过调整参数,可以精确控制新坐标轴的位置、尺寸及其与其他元素的关系。
plt.axes()
方法的参数如下:
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
arg | list or tuple or None | None | 定义新坐标轴的位置和大小。 - 当为 None 时,创建一个与默认坐标轴重叠的新坐标轴。- 当为 [left, bottom, width, height] 列表或元组时,分别指定新坐标轴距离画布左边、底部的距离以及宽度和高度的比例(0到1之间)。 |
projection | str or None | None | 指定坐标轴的投影类型。例如 'polar' 表示极坐标系。 |
polar | bool | False | 如果为 True ,则使用极坐标系。此参数是为了向后兼容性而保留的;推荐直接使用 projection='polar' 。 |
sharex , sharey | Axes object or None | None | 与其它坐标轴共享X轴或Y轴。这在创建多个子图时很有用,以确保它们之间的尺度一致。 |
2. 示例:添加多个绘图区域
import matplotlib.pyplot as plt # 导入 matplotlib.pyplot 模块,用于绘图# 创建一个新的图形(figure),并设置背景颜色为浅灰色
fig = plt.figure(facecolor='lightgray')# 在图形上添加第一个坐标轴(ax1),位置和大小由矩形定义 [left, bottom, width, height]
# 这里 left=0.1, bottom=0.6, width=0.3, height=0.3 表示 ax1 的位置和大小
ax1 = plt.axes([0.1, 0.6, 0.3, 0.3])# 添加第二个坐标轴(ax2),参数含义同上
ax2 = plt.axes([0.5, 0.6, 0.3, 0.3])# 添加第三个坐标轴(ax3),但这次指定 projection='polar' 来创建极坐标图
# 参数同样定义了位置和大小
ax3 = plt.axes([0.1, 0.1, 0.3, 0.3], projection='polar')# 添加第四个坐标轴(ax4),这里使用 projection='3d' 创建三维坐标系
# 参数也定义了其位置和大小
ax4 = plt.axes([0.5, 0.1, 0.3, 0.3], projection='3d')# 显示绘制好的图形窗口
plt.show()
绘制的图形如下图所示:
三、坐标轴的刻度
在 Matplotlib 中,坐标轴的刻度(ticks)是图表中非常重要的元素之一。它们不仅帮助我们理解数据的数值范围,还能通过适当的定位和格式化增强图表的可读性和美观性。
1. 坐标轴的刻度介绍
坐标轴的刻度由两部分组成:
- 刻度定位器(Tick Locator):决定刻度的位置。
- 刻度格式器(Tick Formatter):控制刻度标签如何显示。
通过自定义刻度定位器和格式器,可以实现对图表外观的高度定制,例如添加日期时间刻度、科学计数法表示的大数值等。
2. 刻度定位器和格式器
2.1 刻度定位器
刻度定位器决定了坐标轴上刻度的位置。Matplotlib 提供了多种内置的刻度定位器类,适用于不同的场景需求。
刻度定位器相关类及参数如下:
类名 | 描述 | 参数 | 示例 |
---|---|---|---|
MicrosecondLocator | 微秒级定位器,以微秒为单位定位刻度 | interval :微秒间隔 | ax.xaxis.set_major_locator(MicrosecondLocator(interval=100)) |
SecondLocator | 秒级定位器,以秒为单位定位刻度 | interval :秒间隔 | ax.xaxis.set_major_locator(SecondLocator(interval=30)) |
MinuteLocator | 分钟级定位器,以分钟为单位定位刻度 | interval :分钟间隔 | ax.xaxis.set_major_locator(MinuteLocator(interval=15)) |
HourLocator | 小时级定位器,以小时为单位定位刻度 | interval :小时间隔 | ax.xaxis.set_major_locator(HourLocator(interval=2)) |
DayLocator | 天级定位器,以每月的指定日期为单位定位刻度 | interval :天数间隔 | ax.xaxis.set_major_locator(DayLocator(interval=7)) |
WeekdayLocator | 工作日级定位器,以工作日为单位定位刻度 | byweekday :指定工作日(如MO, TU等) | ax.xaxis.set_major_locator(WeekdayLocator(byweekday=MO)) |
MonthLocator | 月份级定位器,以月为单位定位刻度 | interval :月间隔 | ax.xaxis.set_major_locator(MonthLocator(interval=3)) |
YearLocator | 年份级定位器,以年为单位定位刻度 | base :年份基数,month :起始月,day :起始日 | ax.xaxis.set_major_locator(YearLocator(base=2, month=1, day=1)) |
AutoLocator | 自动定位器,自动计算刻度位置 | 无 | ax.xaxis.set_major_locator(AutoLocator()) |
MaxNLocator | 最大值定位器,根据指定的最大数量计算刻度位置 | nbins :最大刻度数,steps :允许的步长列表 | ax.xaxis.set_major_locator(MaxNLocator(nbins=5)) |
LinearLocator | 线性定位器,根据线性间隔的要求计算刻度的位置 | numticks :刻度数量 | ax.xaxis.set_major_locator(LinearLocator(numticks=6)) |
LogLocator | 对数定位器,根据对数间隔的要求计算刻度的位置 | base :对数底,subs :次要刻度倍数 | ax.xaxis.set_major_locator(LogLocator(base=10)) |
MultipleLocator | 多点定位器,根据指定的基数(相邻两个刻度的间距)计算刻度的位置 | base :刻度间隔 | ax.xaxis.set_major_locator(MultipleLocator(base=0.5)) |
FixedLocator | 定点定位器,将指定坐标列表直接设置为刻度位置,完全跳过自动刻度计算过程 | locs :刻度位置列表 | ax.xaxis.set_major_locator(FixedLocator(locs=[0, 1, 2, 3])) |
IndexLocator | 索引定位器,根据指定的整数数量计算刻度的位置 | base :步长,offset :偏移量 | ax.xaxis.set_major_locator(IndexLocator(base=2, offset=1)) |
NullLocator | 空定位器,没有任何刻度 | 无 | ax.xaxis.set_major_locator(NullLocator()) |
2.2 刻度格式器
刻度格式器负责将刻度值转换为字符串显示。通过使用不同的格式器,可以灵活地调整刻度标签的显示格式。
刻度格式器相关类及参数如下:
类名 | 描述 | 参数 | 示例 |
---|---|---|---|
NullFormatter | 空格式器,不显示任何刻度标签 | - | ax.xaxis.set_major_formatter(NullFormatter()) |
IndexFormatter | 索引格式器,用于显示离散化的序列刻度值 | seq (序列) | ax.xaxis.set_major_formatter(IndexFormatter(seq=[0, 1, 2, 3])) |
FixedFormatter | 固定格式器,用于显示固定列表中的刻度标签 | seq (字符串列表) | ax.xaxis.set_major_formatter(FixedFormatter(seq=['A', 'B', 'C'])) |
FuncFormatter | 函数格式器,用于执行用户定义的函数以格式化刻度标签 | func (格式化函数) | ax.xaxis.set_major_formatter(FuncFormatter(lambda x, pos: f'{x:.2f}')) |
StrMethodFormatter | 字符串方法格式器,使用内置的Python字符串方法格式化刻度标签 | fmt (格式字符串) | ax.xaxis.set_major_formatter(StrMethodFormatter('{x:.2f}')) |
FormatStrFormatter | 格式字符串格式器,使用类似于格式化字符串等类型定义格式 | fmt (格式字符串) | ax.xaxis.set_major_formatter(FormatStrFormatter('%.2f')) |
ScalarFormatter | 标量格式器,用于显示数值型刻度值,比如100000以科学计数法表示1E6 | useOffset , useMathText | ax.xaxis.set_major_formatter(ScalarFormatter(useMathText=True)) |
LogFormatter | 对数格式器,基于对数刻度值显示刻度标签 | - | ax.xaxis.set_major_formatter(LogFormatter()) |
LogFormatterExponent | 对数刻度指数格式器,以指数表示形式显示刻度标签 | labelOnlyBase | ax.xaxis.set_major_formatter(LogFormatterExponent(labelOnlyBase=False)) |
LogFormatterMathtext | 对数刻度数学符号格式器,使数学公式来显示刻度标签 | - | ax.xaxis.set_major_formatter(LogFormatterMathtext()) |
LogFormatterSciNotation | 对数刻度科学符号格式器,使用科学符号来显示刻度标签 | - | ax.xaxis.set_major_formatter(LogFormatterSciNotation()) |
PercentFormatter | 百分比格式器,用于将刻度值转换为百分比形式的刻度标签 | xmax (最大值),decimals (小数位数) | ax.xaxis.set_major_formatter(PercentFormatter(xmax=100, decimals=1)) |
AutoDateFormatter | 日期自动格式器,用于自动识别并格式化轴上的日期刻度,默认的格式为’%Y-%m-%d’,即年-月-日 | tz (时区),defaultfmt (默认格式) | ax.xaxis.set_major_formatter(AutoDateFormatter(tz=None, defaultfmt='%Y-%m-%d')) |
ConciseDateFormatter | 简洁日期格式器,通常用于显示连续时间范围并使用日期偏移量格式化日期刻度 | locator (定位器) | ax.xaxis.set_major_formatter(ConciseDateFormatter(locator=ax.xaxis.get_major_locator())) |
DateFormatter | 日期格式器,用于手动指定坐标轴上的日期格式 | fmt (日期格式字符串) | ax.xaxis.set_major_formatter(DateFormatter('%Y-%m-%d')) |
2.3 示例:刻度定位和格式
from datetime import datetime # 导入datetime模块,用于处理日期和时间import matplotlib.pyplot as plt # 导入matplotlib.pyplot模块,用于绘图
from matplotlib.dates import HourLocator, DateFormatter # 导入HourLocator和DateFormatter类,用于设置坐标轴的时间格式# 定义一个字符串列表,包含一些表示日期时间的信息
dates = ['202310240', '2023102402', '2023102404', '2023102406', '2023102408']
# 将这些字符串转换为datetime对象列表,以便在图表中使用。格式为'%Y%m%d%H',即年月日小时
x_date = [datetime.strptime(d, '%Y%m%d%H') for d in dates]# y轴的数据列表
y_data = [1, 2, 3, 4, 5]# 在图形上创建一个新的坐标轴,位置和大小由矩形定义[left, bottom, width, height]
ax = plt.axes((0.2, 0.2, 0.6, 0.6))# 使用上述坐标轴绘制数据,x轴为日期时间,y轴为数值
ax.plot(x_date, y_data)# 创建一个HourLocator实例,用于每2小时显示一个刻度
hour_loc = HourLocator(interval=2)
# 设置x轴的主要刻度定位器为上面创建的hour_loc
ax.xaxis.set_major_locator(hour_loc)# 创建一个DateFormatter实例,用于格式化x轴上的日期时间为'%H:%M'格式(小时:分钟)
date_fmt = DateFormatter('%H:%M')
# 设置x轴的主要刻度格式化器为上面创建的date_fmt
ax.xaxis.set_major_formatter(date_fmt)# 显示绘制好的图形窗口
plt.show()
绘制的图形如下图所示:
3. 刻度样式
3.1 tick_params()方法介绍
tick_params()
方法在 Matplotlib 中用于更改刻度的样式和外观。通过此方法,可以控制刻度标记(ticks)、刻度标签(tick labels)以及刻度网格线(grid lines)的颜色、宽度、大小等属性。这使得对图表细节进行微调变得简单直接。
tick_params()
方法参数介绍:
参数 | 类型 | 说明 |
---|---|---|
axis | str | 指定要设置哪个轴上的刻度参数。可选值有 'x' , 'y' , 和 'both' (默认)。 |
which | str | 设置哪些刻度被影响。选项包括 'major' , 'minor' , 'both' (默认)。 |
direction | str | 刻度方向。选项包括 'in' , 'out' , 'inout' (默认是 'out' )。 |
length | float | 刻度线的长度(以点为单位)。 |
width | float | 刻度线的宽度(以点为单位)。 |
color | color | 刻度线的颜色。可以是任何 Matplotlib 支持的颜色格式。 |
pad | float | 刻度标签与刻度线之间的距离(以点为单位)。 |
labelsize | float/str | 刻度标签字体大小。也可以是相对大小如 'smaller' , 'x-large' 等。 |
labelcolor | color | 刻度标签颜色。 |
colors | color | 一次性设置刻度线、刻度标签颜色等所有支持颜色的属性。 |
bottom | bool | 如果为 True,则绘制位于轴底部的刻度。 |
top | bool | 如果为 True,则绘制位于轴顶部的刻度。 |
left | bool | 如果为 True,则绘制位于轴左侧的刻度。 |
right | bool | 如果为 True,则绘制位于轴右侧的刻度。 |
labelbottom | bool | 控制是否显示 x 轴底部的刻度标签。 |
labeltop | bool | 控制是否显示 x 轴顶部的刻度标签。 |
labelleft | bool | 控制是否显示 y 轴左侧的刻度标签。 |
labelright | bool | 控制是否显示 y 轴右侧的刻度标签。 |
3.2 示例:刻度样式
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt # 导入matplotlib.pyplot模块用于绘图# 创建一个新的坐标轴对象
ax = plt.axes()# 使用tick_params()方法修改刻度样式:
# axis='both' 表示同时应用到x轴和y轴;
# which='major' 表示这些参数将应用于主刻度(也可以是'minor'或'both');
# labelsize=10 设置刻度标签的字体大小为10;
# colors='r' 将刻度的颜色设置为红色('r'代表red);
# direction='in' 设置刻度线的方向向内;
# length=6 设置刻度线的长度为6点;
# width=2 设置刻度线的宽度为2点。
ax.tick_params(axis='both', which='major', labelsize=10, colors='r', direction='in', length=6, width=2)# 再次使用tick_params()方法对x轴单独进行样式修改:
# axis='x' 表示只应用于x轴;
# colors='b' 将x轴刻度颜色设置为蓝色('b'代表blue);
# pad=10 设置刻度标签与刻度线之间的间距为10点,增加了一些空间。
ax.tick_params(axis='x', colors='b', pad=10)# 显示所创建的图形窗口
plt.show()
绘制的图形如下图所示:
4. 示例:某地区24小时的平均风速
数据如下图所示,需要根据这个数据绘制图形。
实现代码如下所示:
# 导入 datetime 模块,用于处理时间数据
from datetime import datetime# 导入 matplotlib.pyplot 模块,用于绘图
import matplotlib.pyplot as plt
# 导入 pandas 模块,用于读取和处理 CSV 数据
import pandas as pd
# 从 matplotlib.dates 导入 DateFormatter 和 HourLocator
# 用于格式化时间轴的显示方式(如小时、分钟)和设置刻度间隔
from matplotlib.dates import DateFormatter, HourLocator# 设置中文字体为 SimHei(黑体),以确保中文可以正常显示在图表上
# 否则中文可能显示为方框或乱码
plt.rcParams['font.sans-serif'] = ['SimHei']# 解决坐标轴负号 '-' 显示为方块的问题
# 某些中文字体不支持 Unicode 负号,设置为 False 可正常显示负数
plt.rcParams['axes.unicode_minus'] = False# 定义 CSV 文件的路径,请根据实际文件位置修改
csv_file_path = './data/某地区24小时的平均风速.csv'# 使用 pandas 读取 CSV 文件,返回一个 DataFrame(表格型数据结构)
df = pd.read_csv(csv_file_path)# 1. 创建画布(Figure),用于承载图表内容
# 不指定大小时使用默认尺寸
fig = plt.figure()# 2. 在画布上添加一个自定义位置的绘图区域(Axes)
# 参数 [left, bottom, width, height] 是相对于画布的比例(0~1)
# 这里设置为从左下角 (0.1, 0.1) 开始,宽 0.8、高 0.8,留出边距
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])# 将 '时间' 列的数据(如 2023102401)转换为 datetime 对象
# 使用 apply 和 lambda 函数逐行处理字符串,并按 '%Y%m%d%H' 格式解析为日期时间
x_date = df['时间'].apply(lambda x: datetime.strptime(str(x), '%Y%m%d%H')).tolist()# 提取 '风速 (km/h)' 列的数据并转换为 Python 列表
y_data = df['风速 (km/h)'].tolist()# 绘制折线图
# x: 时间数据,y: 风速数据
# ls='-':线条样式为实线
# marker='>':数据点使用右向三角形作为标记
# ms=6:标记大小为 6
# mfc='#FF9900':标记填充颜色为橙色(十六进制颜色)
ax.plot(x_date, y_data, ls='-', marker='>', ms=6, mfc='#FF9900')# 设置图表标题
ax.set_title('深圳市24小时的平均风速')# 设置 Y 轴标签
ax.set_ylabel('平均风速(km/h)')# 设置 Y 轴的显示范围为 5 到 25 km/h
# 突出风速变化,避免图形压缩或拉伸
ax.set_ylim(5, 25)# 在每个数据点上方添加数值标签
# 使用 text() 方法在每个 (x, y) 点绘制文本
# s=y_data[i]:显示当前风速值
# ha='center':水平居中对齐于数据点
# va='bottom':垂直方向在数据点下方显示(避免遮挡)
for i in range(len(y_data)):ax.text(x=x_date[i], y=y_data[i], s=y_data[i], ha='center', va='bottom')# 设置 X 轴主刻度为每 2 小时一个
hour_loc = HourLocator(interval=2)
ax.xaxis.set_major_locator(hour_loc)# 设置 X 轴主刻度标签的显示格式为 "小时:分钟"(如 08:00)
date_fmt = DateFormatter('%H:%M')
ax.xaxis.set_major_formatter(date_fmt)# 设置所有坐标轴的刻度样式
# direction='in':刻度线向内
# length=6:刻度线长度
# width=2:刻度线粗细
# labelsize=12:刻度标签字体大小
ax.tick_params(direction='in', length=6, width=2, labelsize=12)# 单独设置 X 轴刻度标签旋转 45 度
# 防止时间标签过长导致重叠,提升可读性
ax.tick_params(axis='x', labelrotation=45)# 显示绘制完成的图表
plt.show()
绘制的图形如下图所示:
四、轴脊(Spines)
1. 轴脊介绍
在 Matplotlib 中,轴脊(Spines) 是指坐标轴的边界线,它们定义了绘图区域的框架。每个坐标轴(Axes)默认有四条轴脊:
left
:左侧轴脊right
:右侧轴脊top
:顶部轴脊bottom
:底部轴脊
轴脊不仅用于显示坐标轴的边界,还可以控制刻度和标签的位置。通过自定义轴脊,可以实现多种视觉效果,例如:
- 隐藏某些边框以获得更简洁的图表;
- 将轴脊移动到数据原点(如绘制笛卡尔坐标系);
- 改变轴脊的颜色、线宽或样式。
轴脊对象可通过 ax.spines
字典访问,例如 ax.spines['left']
表示左侧轴脊。
2. 隐藏轴脊
2.1 通过 axis() 方法
plt.axis()
或 ax.axis()
方法不仅可以设置坐标轴的范围,还可以控制坐标轴的整体显示状态,包括是否显示边框(轴脊)。
axis()
方法的参数取值说明:
参数值 | 类型 | 描述 |
---|---|---|
'on' | str | 恢复显示所有坐标轴元素(默认状态),包括轴脊、刻度、标签等。 |
'off' | str | 隐藏所有坐标轴元素,包括轴脊、刻度、标签、标题等。整个坐标轴区域变为空白。 |
'equal' | str | 设置等比例坐标轴(x 和 y 单位长度相等),不改变可见性。 |
'scaled' | str | 类似 'equal' ,但通过调整绘图区域大小实现。 |
'tight' | str | 自动调整坐标轴范围以紧密包围数据。 |
2.2 通过 set_visible()
方法
更精细的控制方式是直接操作 spines
对象的 set_visible()
方法,可以单独隐藏某一条轴脊,而保留其他部分(如刻度、标签)可见。
方法签名
ax.spines[spine_name].set_visible(False)
set_visible()
方法参数
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
b | bool | 无 | 如果为 False ,则隐藏该轴脊;如果为 True ,则显示该轴脊。 |
🔹
spine_name
可选值:'left'
,'right'
,'top'
,'bottom'
2.3 示例:绘制多边形(隐藏轴脊)
import matplotlib.pyplot as plt # 导入 matplotlib 的 pyplot 模块,用于绘制图形# 设置绘图时使用的字体为 SimHei(黑体),解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
# 正常显示负号(-),因为默认情况下使用某些中文字体可能无法正常显示负号
plt.rcParams['axes.unicode_minus'] = False# 多边形顶点 x 坐标列表
x = [0, 2, 4, 3]
# 多边形顶点 y 坐标列表
y = [1, 3, 2, 0]# 使用 fill() 方法填充多边形区域
plt.fill(x, y, # 指定多边形各顶点的坐标facecolor='lightgreen', # 填充颜色为浅绿色alpha=0.5, # 透明度设置为 0.5,值在 0 至 1 之间,0 为完全透明,1 为不透明edgecolor='green', # 边缘线条颜色设为绿色linewidth=2, # 边缘线条宽度设为 2linestyle='--', # 边缘线条样式设为虚线label='多边形填充' # 图例标签名
)# 设置 x 轴的数值范围
plt.xlim(-1, 5)
# 设置 y 轴的数值范围
plt.ylim(-1, 4)# 添加图例,展示图表中的标记信息
plt.legend()# 设置图表标题
plt.title('fill() 填充多边形示例')# 关闭轴脊
plt.axis('off')# 获取当前的坐标轴对象(Axes)
# plt.gca() 是 "get current axes" 的缩写
# 它返回当前正在操作的子图坐标轴,如果没有则创建一个
# ax = plt.gca()# 隐藏图表底部的边框线
# 注意:这也会隐藏 x 轴的横线,但刻度和标签仍可单独控制显示
# ax.spines['top'].set_visible(False)# 隐藏图表左侧的边框线
# 同样,这会隐藏 y 轴的竖线,但不影响刻度和标签
# ax.spines['right'].set_visible(False)# 显示绘制出的图表
plt.show()
绘制的图形如下图所示:
2.4 示例:2018年到2022年的快递业务量及其增长速度
数据如下图所示,需要根据这个数据绘制图形。
实现代码如下所示:
# 导入 matplotlib.pyplot 模块,用于绘图
import matplotlib.pyplot as plt# 导入 pandas 模块,用于读取和处理 CSV 数据
import pandas as pd# 设置绘图时使用的字体为 SimHei(黑体),解决中文无法正常显示的问题
# 否则中文标签、标题等可能显示为方框或乱码
plt.rcParams['font.sans-serif'] = ['SimHei']# 正常显示负号(-)
# 某些中文字体不支持 Unicode 负号,会导致负数显示为方块
# 设置为 False 可确保负号正常显示
plt.rcParams['axes.unicode_minus'] = False# 定义 CSV 文件的路径,请根据实际路径修改
csv_file_path = './data/2018年到2022年的快递业务量及其增长速度.csv'# 使用 pandas 读取指定路径的 CSV 文件,返回一个 DataFrame(二维表格结构)
df = pd.read_csv(csv_file_path)# 创建一个新的图形(Figure)对象,用于承载图表内容
fig = plt.figure()# 在图形上添加一个自定义位置的坐标轴(Axes)
# 参数 [left, bottom, width, height] 表示相对于画布的比例(0~1)
# 这里设置为从 (0.1, 0.1) 开始,宽 0.8、高 0.8,留出边距
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])# 从 DataFrame 中提取 '年份' 列,并转换为 Python 列表作为 X 轴数据
x_year = df['年份'].tolist()# 提取 '快递业务量 (亿件)' 列数据,作为柱状图的 Y 轴数据
y_nums = df['快递业务量 (亿件)'].tolist()# 提取 '增长速度 (%)' 列数据,作为折线图的 Y 轴数据
y_rate = df['增长速度 (%)'].tolist()# 绘制柱状图:显示每年的快递业务量
# x_year: X 轴(年份),y_nums: 柱子高度
# width=0.5: 柱子宽度
# color='lightblue': 柱子颜色为浅蓝色
rect_nums = ax.bar(x_year, y_nums, width=0.5, color='lightblue')# 设置主坐标轴(ax)的图表标题
ax.set_title('2018-2022年的快递业务量及其增长速度')# 设置主坐标轴 Y 轴的标签
ax.set_ylabel('业务量(亿件)')# 设置主坐标轴 Y 轴的显示范围为 0 到 1400 亿件
# 保证图形空间合理,避免压缩或拉伸
ax.set_ylim(0, 1400)# 在每个柱子的顶部添加数值标签
# 使用 text() 方法逐个标注数据
for i in range(len(y_nums)):ax.text(x=x_year[i], # X 位置:对应年份y=y_nums[i], # Y 位置:柱子顶部s=y_nums[i], # 显示内容:业务量数值fontsize=11, # 字体大小ha='center', # 水平居中对齐于柱子va='bottom' # 垂直方向在柱子上方显示)# 创建一个与 ax 共享 X 轴的右侧坐标轴(用于绘制增长速度)
ax_right = ax.twinx()# 绘制折线图:显示每年的增长速度
# x_year: X 轴(年份),y_rate: Y 轴(增长率)
# color='lightcoral': 线条颜色为浅珊瑚色
# marker='o': 数据点用圆形标记
# ms=6: 标记大小为 6
# mfc='white': 标记内部填充为白色
line_rate = ax_right.plot(x_year, y_rate, color='lightcoral', marker='o', ms=6, mfc='white')# 设置右侧坐标轴 Y 轴的标签
ax_right.set_ylabel('增长速度(%)')# 设置右侧坐标轴 Y 轴的显示范围为 0 到 100%
ax_right.set_ylim(0, 100)# 在每个折线数据点上方添加增长率数值标签
for i in range(len(y_rate)):ax_right.text(x=x_year[i], # X 位置:对应年份y=y_rate[i], # Y 位置:数据点位置s=y_rate[i], # 显示内容:增长率数值fontsize=11, # 字体大小ha='center', # 水平居中对齐va='bottom' # 垂直方向在点上方显示)# 手动创建图例,合并柱状图和折线图的图例项
# [rect_nums, line_rate[0]]: 分别是柱状图对象和折线图中的 Line2D 对象
# labels: 图例文字
# loc='upper left': 图例放在左上角
# ncol=2: 设置图例为 2 列(但这里写成了 26.6,可能是笔误)
plt.legend([rect_nums, line_rate[0]], ['快递业务量', '比去年增长'], loc='upper left', ncol=2)# 隐藏主坐标轴(ax)顶部的边框线,使图表更简洁
ax.spines['top'].set_visible(False)# 隐藏右侧坐标轴(ax_right)顶部的边框线,保持风格统一
ax_right.spines['top'].set_visible(False)# 显示最终绘制的图表
plt.show()
绘制的图形如下图所示:
3. 移动轴脊
在 Matplotlib 中,通过移动轴脊(Spines)的位置,可以创建更灵活、更具表现力的图表样式。例如,将坐标轴置于图形中心,模拟数学中的笛卡尔坐标系,或实现类似于 R 语言 ggplot2
风格的“下方-左侧”坐标轴布局。
3.1 通过 set_position() 方法
set_position()
是 Spine
对象的一个方法,用于设置轴脊的位置。它可以将某条轴脊从默认边缘位置移动到指定坐标或相对位置。
方法签名
ax.spines[spine_name].set_position(position)
set_position()
方法参数取值说明:
位置类型(position) | 参数格式 | 描述 | 示例 |
---|---|---|---|
'outward' | (orientation, amount) | 将轴脊向外偏移指定距离(单位:点)。负值表示向内。 | ('outward', 10) |
'axes' | (orientation, 0~1) | 相对于轴的归一化位置(0 到 1)。0 表示起点,1 表示终点。 | ('axes', 0.5) 表示移动到轴的中间 |
'data' | (orientation, value) | 移动到数据空间中的某个具体数值位置。常用于将轴脊置于原点。 | ('data', 0) |
'center' | 简写形式 | 等价于 'data' 类型中的 (orientation, 0) ,即将轴脊置于数据为 0 的位置。 | 'center' |
'zero' | 简写形式 | 同 'center' ,语义更明确,表示移动到数据零点。 | 'zero' |
🔹
orientation
可选值:
- 对于
left
/right
轴脊:使用'y'
- 对于
bottom
/top
轴脊:使用'x'
3.2 示例:绘制多边形(移动轴脊)
import matplotlib.pyplot as plt # 导入 matplotlib 的 pyplot 模块,用于绘制图形# 设置绘图时使用的字体为 SimHei(黑体),解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
# 正常显示负号(-),因为默认情况下使用某些中文字体可能无法正常显示负号
plt.rcParams['axes.unicode_minus'] = False# 多边形顶点 x 坐标列表
x = [0, 2, 4, 3]
# 多边形顶点 y 坐标列表
y = [1, 3, 2, 0]# 使用 fill() 方法填充多边形区域
plt.fill(x, y, # 指定多边形各顶点的坐标facecolor='lightgreen', # 填充颜色为浅绿色alpha=0.5, # 透明度设置为 0.5,值在 0 至 1 之间,0 为完全透明,1 为不透明edgecolor='green', # 边缘线条颜色设为绿色linewidth=2, # 边缘线条宽度设为 2linestyle='--', # 边缘线条样式设为虚线label='多边形填充' # 图例标签名
)# 设置 x 轴的数值范围
plt.xlim(-1, 5)
# 设置 y 轴的数值范围
plt.ylim(-1, 4)# 添加图例,展示图表中的标记信息
plt.legend()# 设置图表标题
plt.title('fill() 填充多边形示例')# 获取当前的坐标轴对象(Axes)
# plt.gca() 是 "get current axes" 的缩写
# 它返回当前正在操作的子图坐标轴,如果没有则创建一个
ax = plt.gca()# 隐藏图表底部的边框线
# 注意:这也会隐藏 x 轴的横线,但刻度和标签仍可单独控制显示
ax.spines['top'].set_visible(False)# 隐藏图表左侧的边框线
# 同样,这会隐藏 y 轴的竖线,但不影响刻度和标签
ax.spines['right'].set_visible(False)# 将左侧(Y轴)边框线(spine)移动到图形的水平中心位置
# ('axes', 0.5) 表示位置是相对于整个坐标轴宽度的 50% 处
# 即:Y轴将显示在图形中间(常用于对称数据或坐标原点居中)
ax.spines['left'].set_position(('axes', 0.5))# 将底部(X轴)边框线(spine)移动到图形的垂直中心位置
# ('axes', 0.5) 表示位置是相对于整个坐标轴高度的 50% 处
# 即:X轴将显示在图形中间,与上面的Y轴一起形成十字交叉坐标系
ax.spines['bottom'].set_position(('axes', 0.5))# 将左侧(Y轴)边框线重新定位到数据值为 3 的位置
# ('data', 3) 表示 Y轴 将移动到 X=3 的垂直线上
# 注意:这行会覆盖上面第一行的设置(一个 spine 不能同时有两个位置)
# 通常用于将坐标轴移动到某个特定的数据点上
# ax.spines['left'].set_position(('data', 3))# 显示绘制出的图表
plt.show()
绘制的图形如下图所示: