MATLAB中annotation组件负位置绝对定位的解决方案咨询
MATLAB annotation负位置绝对定位解决方案
问题描述
和text组件不同,MATLAB的annotation函数不允许设置负位置,但我需要用它实现绝对定位。在下面的示例中,我想把文本定位到负位置(让文本更靠下),有没有可行的解决方法?我猜可以对图形做填充,但不知道具体操作,而且方法要适配所有view(文本必须保持绝对定位)。

示例代码:
[X, Y, Z] = ndgrid(linspace(-8,8,40), linspace(-8,8,40), linspace(-8,8,40)); D = X.*Y.*Z; D = D * (100 / max(D, [], 'all')); for ii = 10:10:100 patch(isosurface(D, ii, D), 'FaceColor', 'interp', 'LineStyle', 'none') end view([3 1 1]) annotation('textbox', [.5 0 .1 .1], 'String', 't=5', 'EdgeColor', 'none')
可行解决方法
方法一:扩展图形可绘制区域
annotation的位置是基于figure的归一化可绘制区域(InnerPosition),我们可以向下扩展这个区域,让原本的“负位置”变成合法的可绘制区域坐标:
[X, Y, Z] = ndgrid(linspace(-8,8,40), linspace(-8,8,40), linspace(-8,8,40)); D = X.*Y.*Z; D = D * (100 / max(D, [], 'all')); fig = gcf; % 保存原可绘制区域,向下扩展10%的figure高度 orig_inner = fig.InnerPosition; fig.InnerPosition = [orig_inner(1), orig_inner(2)-orig_inner(4)*0.1, orig_inner(3), orig_inner(4)*1.1]; for ii = 10:10:100 patch(isosurface(D, ii, D), 'FaceColor', 'interp', 'LineStyle', 'none') end view([3 1 1]) % 现在可以设置负的y坐标,对应扩展出的底部区域 annotation('textbox', [.5 -0.09 .1 .1], 'String', 't=5', 'EdgeColor', 'none')
调整后不管怎么切换view,文本都会固定在figure的底部扩展区域,保持绝对定位。
方法二:用uicontrol替代annotation
uicontrol的文本框支持基于figure像素坐标的绝对定位,允许设置负位置,完全不受axes的view影响:
[X, Y, Z] = ndgrid(linspace(-8,8,40), linspace(-8,8,40), linspace(-8,8,40)); D = X.*Y.*Z; D = D * (100 / max(D, [], 'all')); fig = gcf; for ii = 10:10:100 patch(isosurface(D, ii, D), 'FaceColor', 'interp', 'LineStyle', 'none') end view([3 1 1]) % 创建文本框,Position格式为[左坐标 上坐标 宽度 高度],基于figure像素 uicontrol('Style','text','String','t=5',... 'Position',[fig.Position(3)/2 -20 50 20],... 'BackgroundColor','none','EdgeColor','none');
这里的-20让文本框顶部处于figure底部下方20像素的位置,完美实现绝对定位。
内容的提问来源于stack exchange,提问作者OverLordGoldDragon
相关产品推荐
相关产品推荐

