Pytanie w sprawie legend, matlab – Wykresowanie MATLAB: przypisywanie etykiet legendy podczas wydruku

10

Kreślę dane w typowym formacie wykresu rozrzutu MATLAB. Zwykle podczas drukowania wielu zestawów danych używałbym polecenia „trzymaj się;”, a następnie kreślę wszystkie dane, po czym następuje moja legenda:

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

Jednak (wielokrotne) zbiory danych, które wykreślam na tych samych osiach, niekoniecznie muszą być tymi samymi zestawami danych za każdym razem. Kreślę do sześciu różnych zestawów danych na tych samych osiach, i może występować dowolna kombinacja tych danych (w zależności od tego, co użytkownik wybierze do wyświetlenia). Oczywiście byłoby dużo innych rzeczy, gdybym chciał ustawić legendę w tradycyjny sposób.

To, co naprawdę chciałbym zrobić, to przypisać każdemu DataSetowi nazwęjak to jest wykreślone tak, że później mogę po prostu wywołać legendę wszystkich wyświetlanych danych.

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

Twoja odpowiedź

5   odpowiedzi
11

Jedną z opcji jest skorzystanie z'UserData' własność w ten sposób:

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

Edytuj: Jak zauważył pytający, oryginalna wersja mogłaby przestać działać. Aby to naprawić, określ, który uchwyt ma być powiązany z jaką etykietą (w wersji stałej jest w odpowiedniej kolejności).

Ta metoda wydaje się mieszać kolory i nazwy ... Chyba że implementuję go nieprawidłowo? CaptainProg
To naprawdę fajne rozwiązanie! H.Muster
co masz na myśli, dokładnie ... Ach, rozumiem. Ok, wypróbuj nową wersję! tmpearce
Fantastyczny. Dziękuję Ci. CaptainProg
0

Zrób pętlę for. Ale przed pętlą for utwórz 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). 
3

Możesz spróbować czegoś takiego

for k = 1:10

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

end

legend(h, name);
To też działa. CaptainProg
19

resu:

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

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

Boczna uwaga: Znalazłem wiele takich drobnych sztuczek, sprawiając, że figura wygląda tak, jak chcę, a następnie wybieram opcję menu „Plik” w „Rysunek” i sprawdzam wygenerowany kod wyjściowy.

dobra uwaga z boku! samad montazeri
10

Posługiwać się'DisplayName' jakplot() własność i nazwij swoją legendę jako

legend('-DynamicLegend');

Mój kod wygląda tak:

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/

Odpowiedź ta lub Jonathana powinna być akceptowana! Ela782

Powiązane pytania