
本教程详细阐述了如何在matplotlib绘图中,当数据点基于绝对坐标(如物理尺寸)绘制时,实现轴刻度标签的自定义,使其显示更具业务意义的相对坐标(如网格编号)。通过利用`set_xticks`、`set_yticks`和`set_xticklabels`、`set_yticklabels`函数,用户可以精确控制刻度位置及其对应的显示文本,从而提升图表的可读性和专业性,特别适用于需要将技术数据与直观业务视图相结合的场景。
在数据可视化中,我们经常需要绘制基于精确物理尺寸或绝对坐标的数据点。然而,为了使图表更易于理解和与特定业务场景结合,轴的刻度标签可能需要显示不同于其底层数据值的、更具描述性的“相对”信息。例如,在制造业中,部件上的引脚可能通过绝对X/Y坐标进行定位,但在日常操作或检查中,工程师更倾向于使用“列/行”这样的相对网格标识符。Matplotlib提供了强大的功能来解决这一问题,允许我们灵活地定义刻度位置并为其指定自定义标签。
假设我们有一个包含引脚数据的DataFrame,其中包含:
我们使用X和Y坐标来绘制散点图,以准确反映引脚的实际物理布局。然而,默认情况下,Matplotlib会根据X和Y的数值范围自动生成轴刻度标签,显示如-160.1, -110.1等绝对坐标值。对于需要快速定位引脚的检查人员来说,这些绝对坐标缺乏直观性,他们更希望看到如COLUMN 1, ROW 2这样的相对网格标签。
最初的绘图代码可能如下所示:
import pandas as pd
from matplotlib import pyplot as plt
# 示例数据设置
ID = ['C1;R2', 'C2;R2', 'C1;R1', 'C2;R1'] # 引脚标识符
X = [-160.1, -110.1, -160.1, -110.1] # 绝对X坐标
Y = [974.9, 974.9, 924.9, 924.9] # 绝对Y坐标
COLUMN = ['1', '2', '1', '2'] # 相对列号
ROW = ['2', '2', '1', '1'] # 相对行号
# 合并并转换为DataFrame
list_of_tuples = list(zip(ID, X, Y, COLUMN, ROW))
Data = pd.DataFrame(list_of_tuples, columns=['ID', 'X', 'Y', 'COLUMN', 'ROW'])
# 绘制散点图
fig, ax = plt.subplots()
ax.scatter(Data['X'], Data['Y'])
# 默认轴标签
plt.xlabel('X Position')
plt.ylabel('Y Position')
ax.set_title("Reference Plot (Default Ticks)", size=18)
# 标记数据点ID
Data[['X','Y','ID']].apply(lambda row: ax.text(row['X'], row['Y'], row['ID']), axis=1)
plt.show()运行上述代码,我们将得到一个以绝对X/Y坐标作为轴刻度标签的图表,这与我们的期望不符。
Matplotlib提供了Axes对象的set_xticks()、set_yticks()以及set_xticklabels()、set_yticklabels()方法,允许我们精确控制轴刻度。
set_xticks(locations) / set_yticks(locations): 这些函数用于指定刻度应该出现在数据坐标系中的哪些绝对位置。传入一个列表或数组,其中包含你希望显示刻度的所有X或Y坐标值。
set_xticklabels(labels) / set_yticklabels(labels): 这些函数用于为之前通过set_xticks()或set_yticks()指定的刻度位置设置自定义的文本标签。传入一个与刻度位置列表长度相同的列表或数组,其中包含对应的字符串标签。
关键在于,set_xticks/set_yticks定义了刻度的“物理位置”,而set_xticklabels/set_yticklabels定义了这些位置上显示的“文本内容”。
让我们修改上述代码,将绝对X/Y坐标映射到相对的列/行标签。
首先,我们需要确定哪些绝对X坐标对应哪些列号,以及哪些绝对Y坐标对应哪些行号。从我们的示例数据中可以看出:
基于此,我们可以定义刻度位置和对应的标签。
import pandas as pd
from matplotlib import pyplot as plt
# 示例数据设置 (同上)
ID = ['C1;R2', 'C2;R2', 'C1;R1', 'C2;R1']
X = [-160.1, -110.1, -160.1, -110.1]
Y = [974.9, 974.9, 924.9, 924.9]
COLUMN = ['1', '2', '1', '2']
ROW = ['2', '2', '1', '1']
list_of_tuples = list(zip(ID, X, Y, COLUMN, ROW))
Data = pd.DataFrame(list_of_tuples, columns=['ID', 'X', 'Y', 'COLUMN', 'ROW'])
# 绘制散点图
fig, ax = plt.subplots(figsize=(8, 6)) # 调整图表大小以获得更好的视觉效果
ax.scatter(Data['X'], Data['Y'], s=100, zorder=2) # 增加点的大小,并设置zorder使其在文本下方
# 设置图表标题
ax.set_title("Reference Plot (Relative Ticks)", size=18)
# 标记数据点ID
# 使用更清晰的text参数,并调整位置避免覆盖点
for idx, row in Data.iterrows():
ax.text(row['X'], row['Y'] + 5, row['ID'],
horizontalalignment='center', verticalalignment='bottom',
fontsize=9, color='darkblue')
# --- 核心步骤:自定义刻度位置和标签 ---
# 定义X轴刻度的绝对位置
x_tick_locations = sorted(Data['X'].unique()) # 从数据中提取唯一的X坐标并排序
# 定义X轴刻度对应的相对标签
x_tick_labels = sorted(Data['COLUMN'].unique(), key=int) # 从数据中提取唯一的COLUMN标签并按数值排序
# 应用X轴刻度设置
ax.set_xticks(x_tick_locations)
ax.set_xticklabels(x_tick_labels)
# 定义Y轴刻度的绝对位置
y_tick_locations = sorted(Data['Y'].unique()) # 从数据中提取唯一的Y坐标并排序
# 定义Y轴刻度对应的相对标签
y_tick_labels = sorted(Data['ROW'].unique(), key=int) # 从数据中提取唯一的ROW标签并按数值排序
# 应用Y轴刻度设置
ax.set_yticks(y_tick_locations)
ax.set_yticklabels(y_tick_labels)
# 更新轴标签以反映新的含义
plt.xlabel('COLUMN')
plt.ylabel('ROW')
# 调整图表布局
plt.grid(True, linestyle='--', alpha=0.6) # 添加网格线
plt.tight_layout() # 自动调整子图参数,使之填充整个图像区域
# 显示图表
plt.show()通过灵活运用Matplotlib的set_xticks()、set_yticks()、set_xticklabels()和set_yticklabels()函数,我们可以有效地将图表的底层绝对数据坐标转换为更具业务意义的相对标签。这种方法在需要将技术精度与用户友好性相结合的场景中尤为重要,能够显著提升数据可视化的沟通效率和专业度。掌握这些自定义刻度的方法,是Matplotlib高级应用中的一项关键技能。
以上就是Matplotlib轴刻度自定义:将绝对坐标映射为相对标签的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号