2017-02-26 447 views
4

MATLAB圖例列出了圖中的所有內容,包括您已將圖放置在圖上的指南。隱藏圖中某些圖形對象的MATLAB圖例條目

在敷衍繞過那就是做

*Plot 
*Add legend 
*Add guidelines 

然而,MATLAB把最近的線在前面,意思是指引然後再坐在顯示的數據;醜陋和分散注意力。

類似的問題在任何時候發生,你建立一個複雜的情節,legend怪胎出來,抓住一切,並密謀爲了解決方法可以醜

示例代碼:

%**** Optional guidelines 
figure(1) 
plot([2 2],[0,1],'k--'); hold on 

%**** DATA 
N = 4; 
y=rand(5,N); 
x=1:1:5; 
for plotLoop=1:N; 
    %* Plot 
    figure(1) 
    plot(x,y(plotLoop,:)); 
    hold on 
end 

%*****LEGEND 
hLegend = legend(LegTxt,... 
       'interpreter','latex',... 
       'location','eastoutside') 

(移動代碼塊爲了複製上述情況)

如何合理地解決這個問題?

+0

我已經更新了標題,以使它有點更一般 - 它可能不僅僅是指導方針,而是例如粗線條或類似物,您不想顯示爲圖例條目 – Jonas

回答

6

如果你想有一個特定的圖形對象,以不產生傳說(如果您切換的傳說,然後再打開這甚至會工作),你可以修改LegendInformation

%# plot something that shouldn't show up as legend 
handleWithoutLegend = plot(something); 

%# modify the LegendInformation of the Annotation-Property of the graphical object 
set(get(get(handleWithoutLegend,'Annotation'),'LegendInformation'),... 
    'IconDisplayStyle','off'); 

%# toggle legend on and off at will, and never see the something-object appear 

如果您嘗試關閉圖例句柄的數組上,最好的辦法就是循環他們,用一個try-包裝的圖形對象不能產生一個傳說:

for h = listOfHandles(:)' 
    try 
     set(get(get(h,'Annotation'),'LegendInformation'),... 
     'IconDisplayStyle','off'); 
    end 
end 
+1

我建議把這個命令放到一個函數「noLegend」之類的東西里,因爲我真的不能記住它。 – Jonas

+0

我嘗試使用代碼,並得到錯誤'從單元格轉換爲double是不可能的.'' get(bla,'LegendInformation')'。你知道爲什麼嗎?我認爲代碼只適用於一些圖形對象,而不是全部? –

+0

@Mark_Anderson:我現在添加了一個可以解決您的問題的循環解決方案。 – Jonas

3

製作一個自定義手柄,將其送入legend。繪圖手柄可以連接起來形成圖例很高興接受爲輸入的對象。

所需的代碼並不漂亮,但它確實有效。

%**** Optional guidelines for periodicity 
figure(1) 
plot([2 2],[0,1],'k--'); hold on 

%**** DATA 
N = 4; 
y=rand(5,N); 
x=1:1:5; 

for plotLoop=1:N; 
    LegTxt{plotLoop} = num2str(plotLoop); 
    %* Plot 
    figure(1) 

    % if statement to construct a handle for the legend later 
    if plotLoop==1 
     htot=plot(x,y(plotLoop,:)); 
    else 
     h=plot(x,y(plotLoop,:)); 
     % Append this info to the figure handle 
     htot= [htot, h]; 
    end 
    hold on 

end 

%*****LEGEND 
hLegend = legend(htot,LegTxt,... 
       'interpreter','latex','FontSize',16,... 
       'location','eastoutside') 

對於迂腐或好奇,環路for plotLoop=1:N;是在這裏,因爲我從一些相當複雜的代碼,其中所述數據是從單元陣列中提取提取的例子。顯然你可以在很多使用場景中消除這個循環,我只是決定保持代碼的最靈活的格式!

+0

此方法可行,但如果您手動關閉圖例然後重新打開,則不需要的項目仍會出現。幸運的是,還有另一種解決方案:http://stackoverflow.com/a/42471561/232610 – Jonas

+0

夠公平的,我從來沒有在MATLAB中使用手動繪圖交互工具,所以我沒有遇到問題! –