Main Content

控制坐标区纵横比

坐标区纵横比属性

axis 命令通过设置各种坐标区对象属性来实现效果。您可以直接设置这些属性,精确实现您想要的效果。

属性

描述

DataAspectRatio

设置各个坐标轴数据值的相对比例。将 DataAspectRatio 设置为 [1 1 1] 可按正确比例显示真实世界的对象。为 DataAspectRatio 指定值将覆盖伸展填充行为。

通过 daspect 进行设置

DataAspectRatioMode

auto 模式下,MATLAB® 软件将选择能在可用空间提供最高分辨率的轴刻度。

PlotBoxAspectRatio

设置坐标区图框的比例(将 box 设置为 on 可以看到图框)。为 PlotBoxAspectRatio 指定值将覆盖伸展填充行为。

通过 pbaspect 进行设置

PlotBoxAspectRatioMode

auto 模式下,MATLAB 将 PlotBoxAspectRatio 设置为 [1 1 1],除非您显式设置 DataAspectRatio 和/或坐标轴范围。

Position

通过四元素向量([左偏移下偏移])定义坐标区的位置和大小。

XLim, YLim, ZLim

设置各个轴的最小范围和最大范围。

XLimMode , YLimMode , ZLimMode

auto 模式下,MATLAB 会选择坐标轴范围。

当模式属性设置为 auto 时,MATLAB 会自动确定所有这些属性的值,然后伸展坐标区以适合图窗形状。通过指定属性值或将模式属性设置为手动,可以覆盖任何属性的自动操作。

您为特定属性选择的值主要取决于要显示的数据类型。通过 MATLAB 可视化的大部分数据都属于以下两种情况之一:

  • 以线图、网格图或其他专业绘图方式显示的数值数据

  • 真实世界对象(例如,机动车辆或地球地形剖面图)的表示

在第一种情况下,通常需要选择能够在每个轴方向提供清晰分辨率并能填满可用空间的坐标轴范围。但是,对于真实世界对象,则需要按比例精确表示,而不管视角如何。

MATLAB 的默认属性值用于

  • 选择坐标轴范围以涵盖数据范围(当 XLimModeYLimModeZLimMode 设置为 auto 时)。

  • 通过单独设置每个轴的标度,在可用空间提供最高分辨率(当 DataAspectRatioModePlotBoxAspectRatioMode 设置为 auto 时)。

  • 通过调整 CameraViewAngle 来绘制适合位置矩形的坐标区,然后根据需要对坐标区进行伸展填充。

默认纵横比选择

坐标区属性 Position 指定坐标区在图窗中的位置和尺寸。Position 向量的第三个和第四个元素(宽度和高度)定义了一个矩形,MATLAB 将在其中绘制坐标区。MATLAB 将调整坐标区以适合该矩形。

坐标区属性 Units 的默认值根据父图窗尺寸进行归一化。这意味着图窗窗口的形状决定位置矩形的形状。当您更改图窗窗口的大小时,MATLAB 会调整位置矩形的形状以适合图窗。

sphere
set(gcf,'Color',[0.90 0.90 0.90])
set(gca,'BoxStyle','full','Box','on')

Figure contains an axes object. The axes object contains an object of type surface.

更改图窗的大小和形状将导致坐标区的大小和形状发生变化。坐标区也可以选择新的轴刻度线位置。

f = gcf;
f.Position(3) = f.Position(3) * 0.67;

Figure contains an axes object. The axes object contains an object of type surface.

重新调整坐标区的形状以适合图窗窗口可能会更改图形的纵横比。MATLAB 将调整坐标区以填满位置矩形,在此过程中可能会导致形状变形。这通常适用于数值数据图形,但不适用于真实显示的对象。

通过调整图窗大小保持坐标区比例

要保持特定的形状,您可以用独立于图窗窗口大小的绝对单位(如英寸)指定坐标区大小。但是,如果您要编写能够适合任意图窗窗口大小的 MATLAB 程序,这并不是一个好方法。更好的做法是指定坐标区的纵横比并覆盖自动伸展填充。

如果您需要特定的纵横比,可以通过指定以下坐标区属性值来覆盖伸展填充:

  • DataAspectRatioDataAspectRatioMode

  • PlotBoxAspectRatioPlotBoxAspectRatioMode

  • CameraViewAngleCameraViewAngleMode

前两组属性直接影响纵横比。将任一模式属性设置为 manual 只会禁用伸展填充,而当前所有属性值都保持不变。在这种情况下,MATLAB 将放大坐标区,直到受限于位置矩形的一个维度为止。例如,将 DataAspectRatio 设置为 [1 1 1]。此外,设置图窗颜色,以查看图窗与坐标区之间的关系。

sphere
daspect([1 1 1])
set(gca,'BoxStyle','full','Box','on')
set(gcf,'Color',[0.90 0.90 0.90])

Figure contains an axes object. The axes object contains an object of type surface.

更改图窗的大小和形状不会改变坐标区的纵横比。

f = gcf;
f.Position(3) = f.Position(3) * 0.67;

Figure contains an axes object. The axes object contains an object of type surface.

设置 CameraViewAngle 属性将禁用伸展填充,还可以防止 MATLAB 在您更改视图时重新调整坐标区的大小。

纵横比属性

了解属性之间如何相互影响很重要,这样才能获得您想要的结果。DataAspectRatioPlotBoxAspectRatio 以及 xyz 坐标轴范围(XLimYLimZLim 属性)都会限制坐标区的形状。

数据纵横比

DataAspectRatio 属性控制轴刻度的比例。例如,要显示数学表达式的曲面图,MATLAB 会选择突出显示函数值的数据纵横比:

[X,Y] = meshgrid((-2:.15:2),(-4:.3:4));
Z = X.*exp(-X.^2 - Y.^2);
surf(X,Y,Z)
set(gca,'BoxStyle','full','Box','on')

Figure contains an axes object. The axes object contains an object of type surface.

daspect 函数返回 DataAspectRatio 属性的实际值。

daspect
ans = 1×3

     4     8     1

这意味着 x 轴上四个单位的长度覆盖的数据值范围与 y 轴上八个单位以及 z 轴上一个单位覆盖的数据值范围相同。坐标区填充的图框的默认纵横比为 [1 1 1]

如果要查看曲面图以使每个轴上的相对大小彼此相等,可将 DataAspectRatio 设置为 [1 1 1]

daspect([1 1 1])

Figure contains an axes object. The axes object contains an object of type surface.

设置 DataAspectRatio 属性值还会将 DataAspectRatioMode 设置为 manual 并覆盖伸展填充,以实现指定的纵横比。

图框纵横比

观察上一节中图的 PlotBoxAspectRatio 值,可以看到它现在采用了之前的 DataAspectRatio 值。pbaspect 函数返回 PlotBoxAspectRatio 的值:

pbaspect
ans = 1×3

     4     8     1

请注意,MATLAB 使用指定的 DataAspectRatio 重新缩放图框以适应该图形。

PlotBoxAspectRatio 属性控制坐标区图框的形状。默认情况下,MATLAB 将此属性设置为 [1 1 1] 并调整 DataAspectRatio 属性,以使图形填满图框或直至受到约束为止。

如果您设置了 DataAspectRatio 值从而防止它改变,则 MATLAB 会更改 PlotBoxAspectRatio

如果您同时指定 DataAspectRatioPlotBoxAspectRatio,MATLAB 将被迫更改坐标轴范围,以遵守您已定义的两个约束。

继续网格示例,如果您同时设置了这两个属性,MATLAB 将更改坐标轴范围,以满足施加于坐标区的两个约束。

daspect([1 1 1])
pbaspect([1 1 1])

Figure contains an axes object. The axes object contains an object of type surface.

调整坐标轴范围

坐标区还具有用于设置 x 轴、y 轴和 z 轴范围的属性。但是,使用 PlotBoxAspectRatioDataAspectRatio 属性指定坐标轴范围会过度约束坐标区。例如,以下命令指定的坐标轴范围将会与 PlotBoxAspectRatio 值相冲突。

set(gca,'DataAspectRatio',[1 1 1],...
        'PlotBoxAspectRatio',[1 1 1],...
        'XLim',[-4 4],...
        'YLim',[-4 4],...
        'ZLim',[-1 1])

Figure contains an axes object. The axes object contains an object of type surface.

如果查询绘图框的纵横比,您会发现 PlotBoxAspectRatio 值已更改,以适应坐标轴范围。

pbaspect
ans = 1×3

     4     4     1

显示真实对象

如果要使显示的对象看起来很逼真,您需要更改 MATLAB 的默认值。例如,以下数据定义一个楔形补片对象。

vert = [0 0 0; 0 1 0; 1 1 0; 1 0 0; 0 0 1; 0 1 1; 1 1 4; 1 0 4];
fac = [1 2 3 4; 2 6 7 3; 4 3 7 8; 1 5 8 4; 1 2 6 5; 5 6 7 8];
patch('Vertices',vert,'Faces',fac,...
   'FaceColor',[0.7 0.7 0.7],'EdgeColor','k')
view(3)

Figure contains an axes object. The axes object contains an object of type patch.

但是,这个坐标区使这些数据定义的实体对象的实际形状变得失真。要按正确的比例显示它,需要设置 DataAspectRatio。设置此属性将使 xyz 方向上的单位相等,并且会阻止坐标区伸展以填充位置矩形,从而显示对象的真实形状。

set(gca,'DataAspectRatio',[1 1 1])

Figure contains an axes object. The axes object contains an object of type patch.