[英]Creating annotation boxes for subplots in a for-loop in Matlab
我在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循環的右側子圖中顯示注釋框?
謝謝
恐怕注釋對象是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
看起來像這樣:
它不是很優雅,但是如果您確實需要使用注釋對象,那么我個人不知道還有其他選擇。 一個不太麻煩的選擇是使用簡單的文本對象,這些對象是軸的屬性,因此對位置更友好:)
希望有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.