在 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 对象,它们是轴的属性,因此对定位更友好 :)
希望对您有所帮助!
我在 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 对象,它们是轴的属性,因此对定位更友好 :)
希望对您有所帮助!