如何基于相对位置设置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
相关产品推荐
相关产品推荐

