MATLAB中子图的坐标轴刻度长度相同

3
我正在MATLAB中创建一个多面板图(具有不同大小的多个轴)。 我希望所有刻度线在所有子图中都具有相同的绝对大小。
根据MATLAB用户指南,刻度线长度是相对于最长轴进行标准化的:
“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. 首先,我需要从“规范化”单位切换到一些固定单位(例如像素)。请参见下面的答案。

  2. 在上面的片段之前的代码中,我调整了图形的大小,并使用 drawnow 更新了它。 但是,MATLAB将在执行图形命令之前到达代码片段,因此报告的大小不正确。 我通过在 drawnow 后放置 pause(0.1)命令来解决该问题。


1
你的解决方案对我有效,在MATLAB 2015a(Mac)上。 - Mr. W.
1个回答

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

谢谢。是的,在此期间我发现单位可能是关键。然而,我实施了一个应该已经解决问题的解决方案,但并没有。现在我也尝试了你提出的解决方案,问题仍然存在;刻度线仍然大小不同。 - lacerbi
1
好的,我的代码假设轴“单位”仍设置为“规范化”,图形“单位”设置为“像素”,所以如果这些已更改,则不起作用。另一个解决方案是什么?你能在问题中添加一些生成具有不同刻度的示例轴的代码吗?只是为了确认:在设置刻度长度后,您没有调整大小/最大化图形,对吗? - KQS
好的,找到解决方案了。在代码的某个部分,在调用 drawnow 更新画面之前,我调整了图像的大小。然而,MATLAB 可能会先执行下面的语句,而不是更新画面。为了解决这个问题,我在 drawnow 的后面添加了一个 pause(0.1) 命令。 - lacerbi
1
啊,这是一个好发现!是的,有时候图形会出现一些奇怪的同步问题。 - KQS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接