【问题标题】:Creating annotation boxes for subplots in a for-loop in Matlab在 Matlab 的 for 循环中为子图创建注释框
【发布时间】:2015-03-17 12:08:46
【问题描述】:

我在 Matlab 中有以下代码,它通过 for 循环运行,从文件中读取数据并绘制 9 个不同的数字,它们对应于我的数据中的一些特定“通道”,所以我决定在 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 循环的右侧子图中添加注释框吗?

谢谢

【问题讨论】:

  • 你能发布一个小数据集,我们可以用它来重现错误吗?谢谢!
  • 嗨,我现在更改了代码,这样您就不需要我正在使用的文件了。所以你现在应该可以重现错误了。。谢谢

标签: matlab plot annotations matlab-figure subplot


【解决方案1】:

恐怕注释对象是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 对象,它们是轴的属性,因此对位置更友好:)

希望有帮助!

【讨论】:

  • 是的,四处寻找上面的东西,我意识到可能是这样。非常感谢您的解决方案,效果很好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 2020-07-23
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
相关资源
最近更新 更多