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

如何获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:10:19