2012-05-24 17 views
9

Plamkuję dane w typowym formacie rozrzutu MATLAB. Zazwyczaj podczas drukowania wielu zestawów danych, chciałbym użyć polecenia „trzymać na;”, a następnie wykreślić każdego z danymi, a następnie to, aby moje legendę:Wykreślanie wykresów MATLAB: przypisywanie etykiet legendy podczas operacji

legend('DataSet1', 'DataSet2') % etcetera 

jednak (kilka) zbiory danych Mam kreślenia na tych samych osiach niekoniecznie są te same zestawy danych za każdym razem. Planuję do sześciu różnych zestawów danych na tych samych osiach i może być dowolna ich kombinacja (w zależności od tego, co użytkownik wybierze do wyświetlenia). Oczywiście byłoby to dużo innego, gdyby chciałem ustawić legendę w tradycyjny sposób.

To, co naprawdę chciałbym zrobić, to przypisać każdemu zestawowi danych nazwę , ponieważ jest ona drukowana, dzięki czemu mogę po prostu wywołać legendę wszystkich wyświetlanych danych.

... Lub, jakiekolwiek inne rozwiązanie tego problemu, o którym każdy może pomyśleć ...?

Odpowiedz

11

Jedną z opcji jest wykorzystanie właściwości 'UserData' tak:

figure; 
hold on 
plot([0 1], [1 0], '-b', 'userdata', 'blue line') 
plot([1 0], [1 0], '--r', 'userdata', 'red dashes') 

% legend(get(get(gca, 'children'), 'userdata'))      % wrong 
legend(get(gca, 'children'), get(get(gca, 'children'), 'userdata')) % correct 

Edit: Jak pytający podkreślił, oryginalna wersja mogłaby wydostać się z zamówienia. Aby to naprawić, należy określić, która klamka pasuje do której etykiety (w wersji stałej jest w poprawnej kolejności).

+0

Ta metoda wydaje się mieszać kolory i nazwy ... Chyba że wprowadzam ją niepoprawnie? – CaptainProg

+0

co masz na myśli, dokładnie ... Ach, rozumiem. OK, wypróbuj nową wersję! – tmpearce

+0

Fantastyczne. Dziękuję Ci. – CaptainProg

3

Można spróbować czegoś podobnego następującym

for k = 1:10 

    h(k) = plot(...); 
    name{k} = ['condition ' num2str(k)]; 

end 

legend(h, name); 
+0

To też działa. – CaptainProg

18

powinien być w stanie ustawić właściwość DisplayName dla każdej działki:

figure 
hold on 
plot(...,'DisplayName','DataSet1') 
plot(...,'DisplayName','DataSet2') 
legend(gca,'show') 

http://www.mathworks.com/help/matlab/ref/line_props.html

Side Uwaga: znalazłem wiele sztuczek, jak to przez coraz postać wyglądać tak, jak chcę, a następnie wybierając opcję menu "Plik" na rysunku "Generuj plik M ..." i sprawdzając wygenerowany kod wyjściowy.

+0

dobra notatka! –

10

Zastosowanie 'DisplayName' jako własność plot() i nazywają swoją legendę jako

legend('-DynamicLegend'); 

Mój kod wygląda następująco:

x = 0:h:xmax;         %// get an array of x-values 
y = someFunction;        %// function 
plot(x, y, 'DisplayName', 'Function plot 1'); %// plot with 'DisplayName' property 

legend('-DynamicLegend',2);     %// '-DynamicLegend' legend 

Źródło: http://undocumentedmatlab.com/blog/legend-semi-documented-feature/

+3

Ta odpowiedź lub Jonathana powinna być akceptowana! – Ela782

0

Dodać do pętli. Ale przed pętlą for przygotuj tablicę.

%for example 

legendset = {} 

for i = 1:10 

%blabla 
%Then in the fore loop say: 

legendset = [legendset;namedata(i)] 

%It puts all names in a column of legendset. 
%Make sure namedata are characters. 

%foreloop ends 
end 

%Then after the foreloop say: 

legend(legendset). 
Powiązane problemy