
本教程旨在解决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):
ax.set_xticklabels(labels) / ax.set_yticklabels(labels):
通过这种方式,我们首先告诉Matplotlib“在哪里”放置刻度线(使用绝对坐标),然后告诉它“显示什么”作为这些刻度线的标签(使用相对标识符)。
我们将通过一个具体的例子来演示如何实现这一功能。假设我们有一个包含部件引脚信息的数据集,其中包含引脚的唯一ID、绝对X/Y坐标以及相对的列/行号。
首先,我们需要准备数据。在这个例子中,数据被组织成一个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
使用绝对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坐标值。
这是实现核心功能的步骤。我们将根据数据中的绝对坐标和对应的相对列/行号来设置刻度。
将这些信息应用到 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')结合以上所有步骤,完整的代码如下:
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()的组合使用,提供了一种强大的机制,使得我们能够在绘图数据使用绝对坐标的同时,为轴刻度提供自定义的、更具业务意义的相对标签。掌握这一技巧,将使您能够创建出既专业又易于理解的复杂数据可视化图表。
以上就是Matplotlib教程:在绝对坐标绘图中使用自定义相对轴刻度标签的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号