在 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
不幸的是,上面的代码 而不是 生成一个所有刻度长度都相等的图形。也许我遗漏了什么?
解决方法。我的代码有两个问题。
首先,我需要从Normalized
单位切换到一些固定单位(比如像素)。请参阅下面的答案。
在代码的某些部分,在上面的代码片段之前,我正在调整图形的大小并且我有一个 drawnow
来更新它。但是,MATLAB 会在执行图形命令之前到达代码片段,因此报告的大小不正确。我通过在 drawnow
.
之后放置 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
的值以匹配我们在此处使用的新单位。
我正在 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
不幸的是,上面的代码 而不是 生成一个所有刻度长度都相等的图形。也许我遗漏了什么?
解决方法。我的代码有两个问题。
首先,我需要从
Normalized
单位切换到一些固定单位(比如像素)。请参阅下面的答案。在代码的某些部分,在上面的代码片段之前,我正在调整图形的大小并且我有一个
drawnow
来更新它。但是,MATLAB 会在执行图形命令之前到达代码片段,因此报告的大小不正确。我通过在drawnow
. 之后放置
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
的值以匹配我们在此处使用的新单位。