【问题标题】:Axes ticks of same length across subplots in MATLAB在 MATLAB 中的子图中相同长度的轴刻度
【发布时间】:2017-01-15 18:08:33
【问题描述】:

我正在 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. 在代码的某些部分,在上面的 sn-p 之前,我正在调整图形的大小,我有一个 drawnow 来更新它。但是,MATLAB 会在图形命令执行之前 到达代码 sn-p,因此报告的大小不正确。我通过在drawnow 之后放置pause(0.1) 命令解决了这个问题。

【问题讨论】:

  • 您的解决方案适用于我,在 MATLAB 2015a (Mac) 上。

标签: matlab matlab-figure axes


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

【讨论】:

  • (+1) 谢谢。是的,与此同时,我发现 Units 可能是关键。但是,我实施了一种应该修复它但没有修复的解决方案。现在我也尝试了您提出的解决方案,但问题仍然存在;蜱虫最终仍然具有不同的大小。
  • 好吧,我的代码假设轴Units 仍设置为normalized,而图形Units 设置为pixels,所以如果它发生了变化,那么它将无法工作。 应该修复它的其他解决方案是什么?您可以在您的问题中添加一些代码来生成带有不等刻度的示例轴吗?只是检查一下:在设置刻度长度后,您没有调整/最大化图形,是吗?
  • 好的,找到了解决方案。在代码的某些部分,之前,我正在调整图形的大小,我有一个drawnow 来更新它。但是,MATLAB 可能会在图形引擎之前到达下面的部分。我通过在drawnow 之后放置pause(0.1) 命令解决了这个问题。
  • 啊,这很好!是的,有时图形可能会出现一些奇怪的同步问题
猜你喜欢
  • 1970-01-01
  • 2021-11-05
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
  • 2014-04-12
  • 1970-01-01
相关资源
最近更新 更多