0

0

Matplotlib轴刻度自定义:将绝对坐标映射为相对标签

心靈之曲

心靈之曲

发布时间:2025-10-19 12:06:07

|

912人浏览过

|

来源于php中文网

原创

Matplotlib轴刻度自定义:将绝对坐标映射为相对标签

本教程详细阐述了如何在matplotlib绘图中,当数据点基于绝对坐标(如物理尺寸)绘制时,实现轴刻度标签的自定义,使其显示更具业务意义的相对坐标(如网格编号)。通过利用`set_xticks`、`set_yticks`和`set_xticklabels`、`set_yticklabels`函数,用户可以精确控制刻度位置及其对应的显示文本,从而提升图表的可读性和专业性,特别适用于需要将技术数据与直观业务视图相结合的场景。

Matplotlib轴刻度自定义:将绝对坐标映射为相对标签

数据可视化中,我们经常需要绘制基于精确物理尺寸或绝对坐标的数据点。然而,为了使图表更易于理解和与特定业务场景结合,轴的刻度标签可能需要显示不同于其底层数据值的、更具描述性的“相对”信息。例如,在制造业中,部件上的引脚可能通过绝对X/Y坐标进行定位,但在日常操作或检查中,工程师更倾向于使用“列/行”这样的相对网格标识符。Matplotlib提供了强大的功能来解决这一问题,允许我们灵活地定义刻度位置并为其指定自定义标签。

问题背景与挑战

假设我们有一个包含引脚数据的DataFrame,其中包含:

  • ID: 引脚的唯一标识符(例如 C1;R2)。
  • X, Y: 引脚的绝对物理坐标(例如 -160.1, 974.9 毫米)。
  • COLUMN, ROW: 引脚的相对网格位置(例如 1, 2)。

我们使用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()方法,允许我们精确控制轴刻度。

快写红薯通AI
快写红薯通AI

快写红薯通AI,专为小红书而生的AI写作工具

下载
  1. set_xticks(locations) / set_yticks(locations): 这些函数用于指定刻度应该出现在数据坐标系中的哪些绝对位置。传入一个列表或数组,其中包含你希望显示刻度的所有X或Y坐标值。

  2. set_xticklabels(labels) / set_yticklabels(labels): 这些函数用于为之前通过set_xticks()或set_yticks()指定的刻度位置设置自定义的文本标签。传入一个与刻度位置列表长度相同的列表或数组,其中包含对应的字符串标签。

关键在于,set_xticks/set_yticks定义了刻度的“物理位置”,而set_xticklabels/set_yticklabels定义了这些位置上显示的“文本内容”。

逐步实现

让我们修改上述代码,将绝对X/Y坐标映射到相对的列/行标签。

首先,我们需要确定哪些绝对X坐标对应哪些列号,以及哪些绝对Y坐标对应哪些行号。从我们的示例数据中可以看出:

  • X坐标 -160.1 对应 COLUMN 1
  • X坐标 -110.1 对应 COLUMN 2
  • Y坐标 924.9 对应 ROW 1
  • Y坐标 974.9 对应 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]
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()

示例代码解析

  1. 数据准备: 保持与原问题一致的数据结构,使用pandas.DataFrame存储引脚的绝对坐标和相对标识。
  2. 绘制散点图: ax.scatter(Data['X'], Data['Y']) 依旧使用绝对坐标进行数据点的定位,这是图表的基础。
  3. 自定义X轴刻度:
    • x_tick_locations = sorted(Data['X'].unique()): 动态地从DataFrame中获取所有不重复的X坐标值,并进行排序。这些将是刻度线实际出现的位置。
    • x_tick_labels = sorted(Data['COLUMN'].unique(), key=int): 动态地获取所有不重复的列号,并转换为整数后排序,作为刻度标签的文本。
    • ax.set_xticks(x_tick_locations): 将计算出的绝对X坐标位置应用为X轴刻度。
    • ax.set_xticklabels(x_tick_labels): 将计算出的相对列号标签应用到对应的X轴刻度位置。
  4. 自定义Y轴刻度: 过程与X轴类似,但应用于Y坐标和行号。
  5. 更新轴标签: 将plt.xlabel和plt.ylabel更新为'COLUMN'和'ROW',以准确反映轴的实际含义。
  6. 增强可读性: 增加了figsize、s(散点大小)、zorder(绘制顺序)、ax.text的对齐方式和偏移量,以及网格线plt.grid和布局调整plt.tight_layout(),使图表更专业、更易读。

注意事项与最佳实践

  • 刻度位置与标签的对应关系: 确保set_xticks/set_yticks传入的刻度位置列表与set_xticklabels/set_yticklabels传入的标签列表在长度和顺序上严格对应。如果顺序不匹配,标签将错误地应用到刻度上。
  • 动态生成刻度: 在实际应用中,刻度位置和标签通常需要从数据中动态提取,而不是硬编码。使用DataFrame.unique()结合sorted()是一个健壮的方法,如示例代码所示。
  • 标签格式化: set_xticklabels/set_yticklabels可以接受任何可转换为字符串的对象作为标签。你可以对标签进行更复杂的格式化,例如添加单位、前缀或后缀。
  • 刻度密度: 如果数据点非常密集,自定义所有点的刻度可能导致轴标签重叠。在这种情况下,你可能需要选择性地显示部分刻度,或者使用旋转标签、调整字体大小等方法。
  • 多轴和子图: 在处理包含多个子图或使用次坐标轴的复杂图表时,确保你正在对正确的Axes对象调用这些方法。
  • 交互性: 对于需要交互式选择和高亮显示特定引脚的场景,自定义刻度标签与事件处理结合使用,可以提供更丰富的用户体验。

总结

通过灵活运用Matplotlib的set_xticks()、set_yticks()、set_xticklabels()和set_yticklabels()函数,我们可以有效地将图表的底层绝对数据坐标转换为更具业务意义的相对标签。这种方法在需要将技术精度与用户友好性相结合的场景中尤为重要,能够显著提升数据可视化的沟通效率和专业度。掌握这些自定义刻度的方法,是Matplotlib高级应用中的一项关键技能。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

54

2025.12.04

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

182

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

283

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

255

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

122

2025.08.07

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

278

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1492

2023.10.24

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 16.2万人学习

Rust 教程
Rust 教程

共28课时 | 4.7万人学习

Git 教程
Git 教程

共21课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号