如何获取MATLAB绘图中指定点的归一化屏幕坐标?
解决Matlab中指定数据点转归一化屏幕坐标并设置子轴位置的问题
要实现让小坐标轴的左下角对应主图中指定数据点(如左图的(40,-8)),核心是将数据坐标转换为figure的归一化[0,1]坐标,再以此设置小轴的位置。具体步骤如下:
1. 核心转换逻辑
Matlab中坐标轴的Position属性是归一化单位的[左边界 下边界 宽度 高度],我们需要把目标数据点的坐标映射到整个figure的归一化坐标系中:
- 先计算数据点在主坐标轴内的相对比例(基于主轴的
XLim和YLim) - 再结合主轴的位置,计算该点在figure中的归一化坐标
2. 修改后的完整代码
%# sample data x = 1:100; left = randn(100,1); right = cumsum(rand(100,1)-0.5); %# build axes positions hBig = [subplot(121) subplot(122)]; %# 创建子图并获取位置 posBig = get(hBig, 'Position'); delete(hBig) %# 创建主坐标轴并设置属性 figure('units','normalized','outerposition',[0 0 1 1]); hAxB(1) = axes('Position',posBig{1}); hAxB(2) = axes('Position',posBig{2}); set(hAxB, 'XLim',[1 100], 'YLim',[-10 10]); %# 计算目标数据点(40,-8)的归一化坐标 target_x = 40; target_y = -8; % 获取左主轴的位置和轴范围 ax_pos = get(hAxB(1), 'Position'); ax_xlim = get(hAxB(1), 'XLim'); ax_ylim = get(hAxB(1), 'YLim'); % 计算数据点在轴内的相对比例 x_ratio = (target_x - ax_xlim(1)) / (ax_xlim(2) - ax_xlim(1)); y_ratio = (target_y - ax_ylim(1)) / (ax_ylim(2) - ax_ylim(1)); % 转换为figure的归一化坐标 fig_x = ax_pos(1) + x_ratio * ax_pos(3); fig_y = ax_pos(2) + y_ratio * ax_pos(4); %# 设置小坐标轴位置(左下角对应目标点,宽度高度可自定义) posSmall{1} = [fig_x, fig_y, 0.16, 0.24]; posSmall{2} = [0.717 0.63 0.16 0.24]; % 右侧小轴位置可同理修改 %# 创建小坐标轴并绘图 hAxS(1) = axes('Position',posSmall{1}); hAxS(2) = axes('Position',posSmall{2}); %# 绘制数据 plot(hAxB(1), x, left, 'b'); plot(hAxB(2), x, right, 'b'); plot(hAxS(1), x, left, 'r'); plot(hAxS(2), x, right, 'r'); %# 设置小轴样式 set(hAxS , 'Color','none', 'XAxisLocation','top', 'YAxisLocation','right');
关键说明
- 转换逻辑不依赖用户交互,直接通过计算得到指定数据点的屏幕归一化坐标
- 如果需要调整小轴的其他对齐方式(比如右上角对应某点),只需修改比例计算后的坐标组合即可,例如右上角的x坐标为
fig_x + 小轴宽度,y坐标为fig_y + 小轴高度
内容的提问来源于stack exchange,提问作者Olivier Hubert
相关产品推荐
相关产品推荐

