MATLAB复制两个.fig文件到一个图中

3

经过大量搜索,我发现有许多类似的问题,然而我仍然无法使用copyobj()简单复制特定的子对象/句柄。

(注意:我对MATLAB图形学还很陌生,因此我的术语/对图形/句柄的理解可能是错误的。请随意指正!)

基本上,每个其他示例似乎都与allchild()一起使用copyobj()。问题在于某些子对象会覆盖图例/标题等以及实际线条。

例如,考虑使用两个虚拟绘图的以下代码:

f = figure;
plot(1:10);
title('plot 1');

f2 = figure;
plot(fliplr(1:10));
title('plot 2');

这将生成以下绘图:

Plots 1

如果我按照建议使用allchild(),我的第一个图与第二个图完全相同。我希望两条线都被绘制出来。您还会注意到旧的“Plot 1”标题现在显示了两个标题重叠在一起的情况:
copyobj(allchild(f2),f);

Plot collision

所以在更多的研究后,我认为我只需要提取“Line”子元素而不是所有子句柄,并将其添加到我的第一个图中。但这会导致错误:
copyobj(findobj(f2, 'Type', 'line'), f);

抛出以下错误:
??? Error using ==> copyobj
Object line[1] can not be a child of parent
figure[1]

我的最终目标将类似于这样(在MS Paint中完成的插图,请忽略其丑陋):

Goal plot


你想复制两个现有的图形,还是只想在同一个图中拥有2个(由自己生成的)绘图?如果是后者,你可以使用hold http://www.mathworks.ch/ch/help/matlab/ref/hold.html (因为你说你是初学者,但我不知道你的水平如何,我只想确保你不会过于复杂化)。 - lib
我知道“等一下”的意思。问题是我从多个逗号分隔的数据日志文件中生成了30多个图表,而我拥有的脚本是设计为在进行下一个文件之前解析数据文件的每一列。我的最终目标是从不同的文件中分组某些列。我想我可以重新编写我的脚本,但是在CSV格式中,一次读取一行的方式比对一个文件进行1列,并使用“等一下”切换文件,然后重复此过程更加并行化。代码已经需要几个小时才能运行,同时逐行解析所有列。 - MrHappyAsthma
我似乎找到了一种使这个工作的方法。请查看下面的答案获取更多信息--可能有更优雅的方法来完成这个任务。但对于我的需求来说,它应该足够好用。 - MrHappyAsthma
1
这个解决方案非常好,我认为没有更优雅的方式了。同时请考虑一下打开这些图表是否会拖慢您的性能。尝试在不使用图形的情况下运行脚本,如果时间节省很大,请考虑直接将您读取的列保存在内存中(即使它们比每个图表所需的数据更多),然后稍后只绘制您需要的内容。 - lib
2
这个问题已经在这个问题:如何将两个图形文件合并成一个文件中得到了考虑。 - Acorbe
1个回答

7

在阅读了更多关于 http://www.mathworks.com/help/matlab/learn_matlab/understanding-handle-graphics-objects.html 的内容后,我发现了这个有关图形对象的图表:

Chart

似乎使用 allchild() 必须以某种方式获取 Axes 对象,然后将其绘制到图形中。抛出的错误是尝试直接将 Line (Plot Objects) 绘制到 Figure 中的结果。
如果我将 Line (Plot Object) 绘制到 Axes 上,它就可以完美地工作:
f = figure;
plot(1:10);
title('plot 1');

f2 = figure;
plot(fliplr(1:10));
title('plot 2');

copyobj(findobj(f2, 'Type', 'line'), gca(f));

Final plot


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接