在MATLAB中

时间:2016-09-07 23:03:27

标签: matlab matlab-figure axes

我在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

不幸的是,上面的代码会产生一个所有刻度长度都相等的数字。也许我错过了什么?

解决方案。我的代码中存在两个问题。

  1. 首先,我需要从Normalized单位切换到某些固定单位(例如像素)。请参阅以下答案。

  2. 在代码的某些部分,在上面的代码段之前,我正在调整数字大小,我有一个drawnow来更新它。但是,MATLAB会在执行图形命令之前到达代码段,因此报告的大小不正确。我在pause(0.1)

  3. 之后放置了drawnow命令解决了这个问题

1 个答案:

答案 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使用的值,以匹配我们在此处使用的新单元。