我在MATLAB中创建了一个多面板图形(多个不同尺寸的轴)。我希望所有刻度线在所有子图中具有相同的绝对大小。
根据MATLAB user guide,标记长度相对于最长轴标准化:
TickLength。刻度标记长度,指定为[2Dlength 3Dlength]形式的双元素向量。 [...]以相对于可见x轴,y轴或z轴线的最长值标准化的单位指定值。
为了使所有刻度都相同,我运行以下代码:
fixlen = 0.005; % Desired target length
for i = 1:numel(h) % Loop over axes handles
rect = get(h(i),'Position'); % Get the axis position
width = rect(3); % Axis width
height = rect(4); % Axis height
axislen = max([height,width]); % Get longest axis
ticklen = fixlen/axislen; % Fix length
set(h(i),'TickDir','out','TickLength',ticklen*[1 1]);
end
不幸的是,上面的代码不会产生一个所有刻度长度都相等的数字。也许我错过了什么?
解决方案。我的代码中存在两个问题。
首先,我需要从Normalized
单位切换到某些固定单位(例如像素)。请参阅以下答案。
在代码的某些部分,在上面的代码段之前,我正在调整数字大小,我有一个drawnow
来更新它。但是,MATLAB会在执行图形命令之前到达代码段,因此报告的大小不正确。我在pause(0.1)
。
drawnow
命令解决了这个问题
醇>
答案 0 :(得分:1)
默认情况下,Axis
个对象的Units
属性设置为normalized
。这意味着Position
属性中的值通过图的大小进行标准化。因此,如果数字不是正方形,则代码可能无法产生所需的行为。
解决此问题的一种方法如下:
rect = get(h(i),'Position'); % Axis position (relative to figure)
hfig = get(h(i),'Parent'); % Handle to parent figure
rectfig = get(hfig, 'Position'); % Figure position (in pixels)
width = rect(3) * rectfig(3); % Absolute width of axis (in pixels)
height = rect(4) * rectfig(4); % Absolute height of axis (in pixels)
这将为您提供屏幕上像素的宽度/高度(假设您没有更改图中的Units
属性)。
如果您使用rectfig = get(hfig,'PaperPosition')
,那么您将在打印页面上获得以英寸为单位的宽度/高度(同样,假设图形的PaperUnits
属性的默认值)。
但请注意,您需要调整fixlen
使用的值,以匹配我们在此处使用的新单元。