在 Matlab 的 for 循环中为子图创建注释框

Creating annotation boxes for subplots in a for-loop in Matlab

我在 Matlab 中有以下代码,它通过一个 for 循环运行,从文件中读取数据并绘制 9 个不同的图形,这些图形对应于我数据中的某些特定 "channels",所以我决定对它们进行注释在for循环中。

 clear
 clc

 for i=1:9
 subplot(3,3,i);
hold on
x = [4 13];  % from your example
y = ([1 1]);    % from your example
y2 = ([-0.4 -0.4]);
H=area(x,y,'LineStyle','none',...
'FaceColor',[1 0.949019610881805 0.866666674613953]);
H1=area(x,y2,'LineStyle','none',...
'FaceColor',[1 0.949019610881805 0.866666674613953]);
% Create textbox
annotation('textbox',...
[0.719849840255583 0.603626943005185 0.176316293929713 0.308290155440411],...
'String',{'FABLIGHT04','Channel',i},...
'FontWeight','bold',...
'FontSize',10,...
'FontName','Geneva',...
'FitBoxToText','off',...
'EdgeColor','none');
axis([0 24 -0.4 1])
set(gca,'XTick',[0:1:24])
set(gca,'YTick',[-0.4:0.2:1])
xlabel('Time (s)');



 end

最初它给了我 9 个不同的数字,并且注释工作正常。但我希望能够将它们平铺到一个子图中以便于比较。

自从我切换到使用子图后,它没有正确注释我的图形。在打开编辑栏并生成代码时,我发现 matlab 首先绘制所有内容,然后将注释框放在同一个图中,一个放在另一个上面。查看它生成的代码,显然它采用了这部分代码:

 annotation('textbox',...
[0.719849840255583 0.603626943005185 0.176316293929713 0.308290155440411],...
'String',{'FABLIGHT04','Channel',i},...
'FontWeight','bold',...
'FontSize',10,...
'FontName','Geneva',...
'FitBoxToText','off',...
'EdgeColor','none');

并将其作为:

annotation(figure1,'textbox'...)
etc etc

因此对于所有 9 个文本框,它将它们放在同一个图形上。我试过 S=subplot(3,3,i) 然后 annotation(S,'textbox') etc etc,我也试过 S(i)=subplot(3,3,i) 然后 annotation(S,'textbox') etc etc 但似乎没有任何效果。

我也试过改变盒子的位置。我似乎也不知道如何让它变小。

有谁知道如何在 for 循环的右侧子图中添加注释框?

谢谢

恐怕注释对象是 figures 的属性而不是 axes,因此很难自定义每个注释对象的位置,因为无论您有多少子图,它们都是同一图形的所有部分,您需要指定它们相对于图形坐标系的位置。

因此,您可以根据其所属的子图手动设置每个文本框在代码中的位置...

简单示例:

clear
clc
close all

figure('Units','normalized'); %// new figure window

for k = 1:2

    str = sprintf('Subplot %d',k);

    subplot(1,2,k)

    plot(rand(1,10));

    %// Customize position here
    hAnnot(k) = annotation('textbox', [k*.4-.2 .6 .1 .1],...
        'String', str,'FontSize',14);

end

看起来像这样:

它不是很优雅,但如果您确实需要使用注释对象,我个人不知道还有其他选择。一个不那么麻烦的替代方法是使用一个简单的 text 对象,它们是轴的属性,因此对定位更友好 :)

希望对您有所帮助!