我正在尝试为我的每个子图设置 XTick。阅读 the MATLAB documentation here 后,我决定执行以下操作,但它不起作用。

MWE

subplot(2, 1, 1);
gca.XTick = [0, 6, 12, 18, 24];
subplot(2, 1, 2);
gca.XTick = [0, 6, 12, 18, 24];

我的 MATLAB 版本是
>> version

ans =

8.4.0.150421 (R2014b)

最佳答案

您不能直接使用 gca,就好像它是赋值操作左侧的句柄引用一样。您可以使用 set(gca, ...) 语法或 ax = gca; ax.XTick ... ,但前提是您避免使用 gca.Whatever = ... 语法,这会由于标识符遮蔽而破坏您执行此操作的工作区中的 gca

语法

gca.XTick = [0, 6, 12, 18, 24];

不会做你想做的。这不是调用 gca() 函数,而是创建一个名为 gca 的新局部变量,并用一个具有名为 XTick 的字段的结构体填充它。这不仅不会设置绘图中的刻度,而且新变量会屏蔽 gca 函数,因此在 gca 或重新启动完成之前,在同一工作区中对 clear 的后续调用将不起作用(它们只会访问本地结构字段)。

使用这样的临时变量
ax = gca;
ax.XTick = [0, 6, 12, 18, 24];

只要您尚未在该工作区中完成 gca.XTick = ... 分配,或者在同一函数中的任何位置进行分配,就应该可以工作。

这是 Matlab 对“统一访问原则”的工作方式的一个不幸的怪癖:您可以调用不带括号的无参数函数或方法(如 set(gca, 'XTick', ...) ),但前提是您不在赋值中也使用相同的标识符作为左值语句在同一个函数中,这会导致解析器将其识别为局部变量而不是函数调用。

简而言之,不要将 gca 放在 = 赋值操作的左侧,它应该可以工作。

示范

您可以使用 whoswhich 看到这一点。将代码放入一个函数中,使其获得一个干净的工作区并使用 which 来查看 gca 解析为什么。
function darnit_gca()

disp('gca is:');
which gca

subplot(2, 1, 1);
gca.XTick = [0, 6, 12, 18, 24];
subplot(2, 1, 2);
gca.XTick = [0, 6, 12, 18, 24];

disp('now gca is:');
which gca

当您运行 darnit_gca 时,一旦将 gca 用作左值,您就可以看到 ojit_code 的分辨率发生变化。
>> darnit_gca
gca is:
built-in (/Applications/MATLAB_R2014b.app/toolbox/matlab/graphics/gca)
now gca is:
gca is a variable.

10-08 11:31