在 MATLAB 中,轴在子图中的长度相同

Axes ticks of same length across subplots in MATLAB

我正在 MATLAB 中创建一个多面板图形(具有 不同 大小的多个轴)。我希望所有刻度线在所有子图中都具有 相同 绝对大小。

根据MATLAB user guide,刻度长度相对于最长轴标准化:

TickLength. Tick mark length, specified as a two-element vector of the form [2Dlength 3Dlength]. [...] Specify the values in units normalized relative to the longest of the visible x-axis, y-axis, or z-axis lines.

为了让所有的刻度都一样长,我是运行下面的代码:

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 会在执行图形命令之前到达代码片段,因此报告的大小不正确。我通过在 drawnow.

  3. 之后放置 pause(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)

这将使您的屏幕像素达到 width/height(假设您没有更改图形的 Units 属性)。

如果您使用 rectfig = get(hfig,'PaperPosition'),那么您将在打印页面上以英寸为单位得到 width/height(同样,假设图中 PaperUnits 属性 的默认值).

但是请注意,您需要调整用于 fixlen 的值以匹配我们在此处使用的新单位。