
本教程旨在解决matplotlib中一个常见的绘图需求:当数据点基于绝对物理坐标(如毫米)绘制时,如何将轴刻度标签替换为更具业务意义的相对标识符(如网格的列/行号)。我们将详细介绍如何利用ax.set_xticks()、ax.set_yticks()、ax.set_xticklabels()和ax.set_yticklabels()函数,在不改变数据点实际位置的前提下,实现轴刻度位置与标签内容的分离,从而提高图表的专业性和可读性。
引言:坐标与标签的灵活需求
在许多工程和制造领域,数据通常以精确的绝对物理坐标(例如,部件上的X、Y毫米位置)进行测量和记录。然而,在进行可视化时,直接显示这些绝对坐标作为轴刻度可能并不直观。用户,特别是现场操作人员,可能更习惯于使用相对的、逻辑性的标识符来定位,例如“第1列,第2行”。
Matplotlib默认的轴刻度行为是将数据点的坐标直接用作刻度位置和标签。这在大多数情况下是合理的,但当我们需要将绝对位置与相对标识符结合时,就需要更精细的控制。本教程将展示如何通过Matplotlib的轴对象方法,实现绘图数据的绝对定位与轴刻度标签的相对自定义,从而创建既精确又易于理解的图表。
核心概念:分离刻度位置与标签内容
Matplotlib通过Axes对象提供了一系列强大的方法来控制轴的各个方面。要实现绝对坐标绘图与相对刻度标签的结合,我们主要依赖以下四个关键函数:
-
ax.set_xticks(locs) / ax.set_yticks(locs):
- 这两个函数用于设置轴上刻度线的位置。locs是一个数值列表,指定了刻度线在数据坐标系中的具体位置。例如,ax.set_xticks([-160.1, -110.1]) 将会在X轴的-160.1和-110.1位置绘制刻度线。这些位置是基于您实际绘图所使用的绝对数据坐标。
-
ax.set_xticklabels(labels) / ax.set_yticklabels(labels):
- 这两个函数用于设置对应刻度线的文本标签。labels是一个字符串列表,其中的每个字符串将作为对应位置刻度线的标签。重要的是,labels列表的长度和顺序必须与locs列表(即通过set_xticks/set_yticks设置的刻度位置)严格匹配。例如,如果您在X轴设置了两个刻度位置,那么set_xticklabels也需要提供两个标签。
通过这种方式,我们首先告诉Matplotlib“在哪里”放置刻度线(使用绝对坐标),然后告诉它“显示什么”作为这些刻度线的标签(使用相对标识符)。
实现步骤
我们将通过一个具体的例子来演示如何实现这一功能。假设我们有一个包含部件引脚信息的数据集,其中包含引脚的唯一ID、绝对X/Y坐标以及相对的列/行号。
1. 数据准备
首先,我们需要准备数据。在这个例子中,数据被组织成一个Pandas DataFrame,包含了引脚ID、绝对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] # 绝对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'])
print("DataFrame内容:")
print(Data)DataFrame内容如下:
ID X Y COLUMN ROW 0 C1;R2 -160.1 974.9 1 2 1 C2;R2 -110.1 974.9 2 2 2 C1;R1 -160.1 924.9 1 1 3 C2;R1 -110.1 924.9 2 1
2. 初始绘图
使用绝对X和Y坐标绘制散点图。
fig, ax = plt.subplots()
ax.scatter(Data['X'], Data['Y'])
# 标注点ID
Data[['X','Y','ID']].apply(lambda row: ax.text(row['X'], row['Y'], row['ID'], ha='center', va='bottom'), axis=1)
# 设置图表标题
ax.set_title("参考图", size=18)此时,X轴和Y轴的刻度将显示为绝对的X和Y坐标值。
3. 自定义轴刻度位置与标签
这是实现核心功能的步骤。我们将根据数据中的绝对坐标和对应的相对列/行号来设置刻度。
- 确定刻度位置 (绝对坐标): 从数据中可以看到,X轴的刻度应该位于 -160.1 和 -110.1。Y轴的刻度应该位于 924.9 和 974.9。
- 确定刻度标签 (相对标识符): 对于X轴,对应的相对列号是 1 和 2。对于Y轴,对应的相对行号是 1 和 2。
将这些信息应用到 set_xticks/set_yticks 和 set_xticklabels/set_yticklabels。同时,为了图表的整体一致性,我们将轴的标签也更新为“COLUMN”和“ROW”。
# 定义自定义刻度位置 (使用绝对坐标)
ax.set_xticks([-160.1, -110.1]) # X轴刻度位于这些绝对X坐标
ax.set_yticks([924.9, 974.9]) # Y轴刻度位于这些绝对Y坐标
# 创建自定义轴刻度标签 (使用相对标识符)
xlabels = ['1', '2'] # X轴刻度标签为相对列号
ylabels = ['1', '2'] # Y轴刻度标签为相对行号
# 将新标签应用到自定义刻度位置
ax.set_xticklabels(xlabels)
ax.set_yticklabels(ylabels)
# 更新轴标签以反映新的含义
plt.xlabel('COLUMN')
plt.ylabel('ROW')4. 完整示例代码
结合以上所有步骤,完整的代码如下:
import pandas as pd
from matplotlib import pyplot as plt
# Setup Lists
ID = ['C1;R2', 'C2;R2', 'C1;R1', 'C2;R1'] # Pin identifier
X = [-160.1, -110.1, -160.1, -110.1] # Absolute X positions (mm)
Y = [974.9, 974.9, 924.9, 924.9] # Absolute Y positions (mm)
COLUMN = ['1', '2', '1', '2'] # Relative X (Column)
ROW = ['2', '2', '1', '1'] # Relative Y (Row)
# Merge Lists
list_of_tuples = list(zip(ID, X, Y, COLUMN, ROW))
# Convert lists to dataframe
Data = pd.DataFrame(list_of_tuples,
columns=['ID', 'X', 'Y', 'COLUMN', 'ROW'])
# Plot points
fig, ax = plt.subplots()
ax.scatter(Data['X'], Data['Y'])
# Label Axis (updated to reflect relative meanings)
plt.xlabel('COLUMN')
plt.ylabel('ROW')
# Set Title
ax.set_title("Reference Plot", size=18)
# Label Points with IDs
Data[['X','Y','ID']].apply(lambda row: ax.text(row['X'], row['Y'], row['ID'], ha='center', va='bottom'),axis=1)
# Define custom tick locations (using absolute coordinates)
ax.set_xticks([-160.1, -110.1]) # X ticks at these blueprint coordinates
ax.set_yticks([924.9, 974.9]) # Y ticks at these blueprint coordinates
# Create custom axis tick labels (using relative identifiers)
xlabels = ['1', '2'] # Give x-ticks relative column number names
ylabels = ['1', '2'] # Give y-ticks relative row number names
# Apply new labels to custom tick locations
ax.set_xticklabels(xlabels)
ax.set_yticklabels(ylabels)
# Display the plot
plt.show()运行这段代码后,您将看到一个散点图,其中数据点仍然精确地位于其绝对X/Y坐标上,但X轴和Y轴的刻度标签分别显示为“1”、“2”,代表列和行,极大地提升了图表的业务可读性。
注意事项与最佳实践
刻度位置与标签的对应关系: 务必确保 set_xticks/set_yticks 中提供的刻度位置数量与 set_xticklabels/set_yticklabels 中提供的标签数量一致,并且顺序要一一对应。如果数量不匹配,Matplotlib会报错或产生非预期的结果。
-
动态生成刻度: 在实际应用中,如果部件的引脚数量或布局是可变的,不应硬编码刻度位置和标签。您可以从DataFrame中动态提取唯一的X/Y坐标作为刻度位置,并提取对应的唯一列/行号作为标签。
例如,要动态获取X轴的刻度位置和标签:
unique_x_coords = Data['X'].unique() unique_columns = Data['COLUMN'].unique() # 确保排序一致,以便标签与位置正确对应 sorted_indices_x = unique_x_coords.argsort() sorted_x_coords = unique_x_coords[sorted_indices_x] sorted_x_labels = unique_columns[sorted_indices_x] ax.set_xticks(sorted_x_coords) ax.set_xticklabels(sorted_x_labels)
对Y轴执行类似操作。
轴标签的更新: 当刻度标签代表的含义发生变化时,不要忘记更新 plt.xlabel() 和 plt.ylabel(),使其与新的刻度标签含义保持一致,避免混淆。
可读性与用户体验: 这种方法特别适用于需要将精确技术数据转化为用户友好界面的场景。通过将原始的、可能难以理解的坐标转换为业务逻辑标识符,可以显著提升图表的可读性和实用性。
总结
Matplotlib通过其灵活的API,允许开发者对图表的每一个细节进行精细控制。ax.set_xticks()、ax.set_yticks()、ax.set_xticklabels()和ax.set_yticklabels()的组合使用,提供了一种强大的机制,使得我们能够在绘图数据使用绝对坐标的同时,为轴刻度提供自定义的、更具业务意义的相对标签。掌握这一技巧,将使您能够创建出既专业又易于理解的复杂数据可视化图表。










