我正在利用映射工具箱的MATLAB中编写一个基本的GUI。GUI 将显示灰度图像,然后在数据上绘制离散点,所有这些都在必要的地图投影上绘制。重要的是,我绘制在地图轴(由 axesm 命令创建的轴)上,而不是在香草笛卡尔空间上。我从命令行完成所有这些操作没有问题,但是我找不到实现GUI版本的方法,这让我发疯。
问题是我需要将地图轴指定为父图形的子项。普通轴具有可以设置的属性,如下所示:
axesHandle = axes('Parent', parentHandle, ...);
或
set(axesHandle, 'Parent', parentHandle);
但是,由 axesm 函数创建的地图轴没有等效的父属性,因此我无法操作图中的轴。我该怎么做?
更新:如果我在空图中的地图轴内创建一个绘图,get(figureHandle,'Children')返回轴m对象的句柄(感谢@slayton!),因此必须通过MATLAB将地图轴对象隐式添加到图形的子项中。
我应该担心地图轴不引用父图形,还是应该让它参考?我想知道这是否是 MATLAB 迫使我不遵守手册告诉我要实施的标准的经典案例。
通过阅读您的问题,我认为您要做的是抓住轴对象的手柄。 这可以通过使用轴或子图创建轴时完成
a = axes();
a = subplot(x,y,z);
% both return an handle to the newly created axes object
此外,如果轴是通过函数调用(如 plot
或 image
)自动创建的,您也可以获得轴句柄:
p = plot(1:10); %returns a handle to a line object
a = get(p,'Parent');
i = image(); %returns a handle to an image object
a = get(i, 'Parent');
最后,这两个选项都不可用,您始终可以从其包含图形中获取轴手柄:
a = get(figureHandle, 'Children');
请记住,如果您的图形包含多个轴,这将返回轴句柄的向量。
最后,当需要绘制时,将点绘制到包含地图图像的轴上,您只需调用:
line(xPoints, yPoints, 'linestyle', 'none', 'marker', '.', 'color', 'r', 'size', 15)
这将使用大红点绘制线的顶点。
我不确定这是否回答了您的问题,因为您提供的代码与您提出的问题不一致。
您提供的代码看起来像您正在尝试将轴从一个图形移动到另一个图形。你完全可以做到这一点!
f = figure('Position', [100 100 100 100]);
a = axes('Parent', f);
pause
f2 = figure('Position', [250 100 100 100]);
set(a,'Parent', f2);
经过多次试验和错误并阅读文档,我发现没有办法显式指定地图轴的父级。相反,它们隐式添加到当前轴的顶部。在当前图中不存在轴的实例中,调用 axesm
将创建一个 axes 对象,然后将 axesm 对象放在其中。当你采取这个路线时,你必须通过调用gca
来获取轴对象句柄:
mapAxesHandle = axesm(...);
axesHandle = gca(...);
这使得在从头开始编写 GUI 时使用映射工具箱变得令人沮丧,但这就是 Mathworks 实现它的方式。感谢@slayton提供的有用信息。我会投赞成票,但我的声誉是 <15 :(