You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于相对位置设置Matplotlib轴刻度(绘图用绝对坐标)

问题背景与需求

我处理带规则引脚网格的制造零件,引脚有反映相对行列位置的唯一标识(比如C1;R2代表第1列、第2行)。没有参考图时,在检测文档里找指定引脚要手动追踪行列,非常麻烦。

我写了个Python脚本,用matplotlib根据引脚的绝对XY坐标(比如-160.1, 974.9毫米)绘图,保证绘图位置和实际零件一致(非等比例),脚本目前运行正常,但需要改进:把轴刻度的位置和标签从当前的绝对X/Y值,替换成相对的列/行标识。

我知道可以手动加注释,但因为有多个零件型号(每个的引脚数量和位置都不一样),想做一个程序化的方案,结合零件编号自动实现,避免手动编码的繁琐。

核心问题:用绝对值绘制特征时,能不能基于相对值定位并标注matplotlib轴刻度?如果可以,怎么在下面的示例脚本里实现?


示例脚本

import pandas as pd
from matplotlib import pyplot as plt

#This script converts lists into a dataframe and plots points using matplotlib

#Setup Lists

ID =  ['C1;R2', 'C2;R2', 'C1;R1', 'C2;R1'] #pin identifier

X = [-160.1, -110.1, -160.1, -110.1] #absolute X

Y = [974.9, 974.9, 924.9, 924.9] #absolute Y

COLUMN = ['1', '2', '1', '2'] #relative X

ROW = ['2', '2', '1', '1'] #relative Y

#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

plt.xlabel('X Position')
plt.ylabel('Y Position')

#Set Title

ax.set_title("Reference Plot", size=18)

#Label Points with IDs

Data[['X','Y','ID']].apply(lambda row: ax.text(*row),axis=1)

#Display the plot

plt.show()

打印的数据框

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数值,点标注引脚ID
  • 期望绘图:X轴刻度替换为列标识(C1、C2),Y轴刻度替换为行标识(R1、R2),刻度位置对应各列/行的绝对坐标位置,点的位置保持绝对坐标不变

解决方案

完全可以实现,核心思路是提取每个相对列/行对应的唯一绝对坐标,将其设为轴刻度位置,同时用相对列/行标识作为刻度标签,修改后的脚本如下:

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
Y = [974.9, 974.9, 924.9, 924.9] #absolute Y
COLUMN = ['1', '2', '1', '2'] #relative X
ROW = ['2', '2', '1', '1'] #relative Y

#Merge Lists & Convert to DataFrame
list_of_tuples = list(zip(ID, X, Y, COLUMN, ROW))
Data = pd.DataFrame(list_of_tuples, columns=['ID', 'X', 'Y', 'COLUMN', 'ROW'])

#Plot points
fig, ax = plt.subplots()
ax.scatter(Data['X'], Data['Y'])

# --- 核心修改部分 ---
# 处理X轴(列):提取唯一绝对X坐标与对应列标识,按顺序排序
x_coords = Data.groupby('COLUMN')['X'].first().sort_index()
ax.set_xticks(x_coords.values)
ax.set_xticklabels([f'C{col}' for col in x_coords.index])

# 处理Y轴(行):提取唯一绝对Y坐标与对应行标识,按顺序排序
y_coords = Data.groupby('ROW')['Y'].first().sort_index()
ax.set_yticks(y_coords.values)
ax.set_yticklabels([f'R{row}' for row in y_coords.index])

# 更新轴标签
ax.set_xlabel('列')
ax.set_ylabel('行')
# --- 修改结束 ---

#Set Title
ax.set_title("引脚参考图", size=18)

#Label Points with IDs
Data[['X','Y','ID']].apply(lambda row: ax.text(*row), axis=1)

#Display the plot
plt.show()

代码说明

  • groupby('COLUMN')['X'].first():按列分组,提取每组对应的唯一绝对X坐标(同一列的引脚X坐标一致)
  • sort_index():保证列/行按数字顺序排列(比如C1在C2前面)
  • set_xticks与set_xticklabels:分别指定刻度的绝对坐标位置和对应的相对列标识,Y轴同理
  • 该方案完全程序化,只要DataFrame包含COLUMN和ROW列,无论零件型号的引脚数量多少,都能自动生成对应刻度

内容的提问来源于stack exchange,提问作者Macondo_Cuanto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 02:50:24