2016-11-30 15 views
8

Potrzebuję zapobiec wyświetlaniu określonego wpisu wydruku w legendzie działki Matlab.Zapobieganie wyświetlaniu określonego wpisu wydruku na legendzie działki MATLAB

Próbka:

% x and y are any plot data 
for i=1:5 
    plot(x,y); 
    plot(x2,y2,'PleaseNoLegend!'); % I need to hide this from legend 
end 
legend('show'); 

Czy istnieje flagi można ustawić wewnątrz polecenia plot więc ten konkretny wpis nie pojawi się w legendzie?

+1

'h = działka (...); hasbehavior (h, 'legend', 'false') 'przynajmniej dla HG1, dunno o HG2. –

+0

Pytanie w imieniu innego użytkownika: czy mógłbyś być bardziej konkretny? Czy jest jakiś warunek, który chcesz ustawić, aby nie drukować? –

+0

Jestem wykreślanie w pętli for, a także w innych częściach kodu, niektóre wątki są tylko pomocnicze i nie chcę, aby pokazać w legendzie. – Pedro77

Odpowiedz

6

Można to osiągnąć, ustawiając właściwość 'HandleVisibility' na 'off'. Zauważ, że to ukrywa uchwyty tych działek dla wszystkich funkcji, nie tylko dla legend.

Na przykład

hold on 
for k = 1:3 
    x = 1:10; 
    y = rand(1,10); 
    x2 = x; 
    y2 = y + 2; 
    plot(x,y); 
    plot(x2,y2,'--','HandleVisibility','off'); % Hide from legend 
end 
legend('show') 

produkuje wykresie

enter image description here

+0

Takie podejście może mieć niezamierzone konsekwencje dla innych funkcji.Polecam również ustawienie legendy dla konkretnych uchwytów, np. coś w stylu 'lh = plot (x1, y1, x2, y2); legend (lh (1), 'label1') ' – stephematician

+2

@stephematician Tak, właśnie to moja ostatnia linia miała sugerować. Twój pomysł jest lepszy; powinieneś opublikować odpowiedź –

4

Można użyć semi-documented function called hasbehavior, który pozwala na ignorowanie pojedynczych działek w legendzie po wydaniu polecenia wydruku.

figure; 
hold on; 
for i=1:5 
    plot(x,y); 
    h = plot(x2,y2); 
    hasbehavior(h,'legend',false); 
end 
legend('show'); 

Fakt, że jest pół-udokumentowane sugeruje, że mógłby złamać prędzej czy później w nowszej wersji MATLAB, więc należy używać z rozwagą. Może to nadal być wygodny wybór dla niektórych aplikacji.

Jak zauważyli @stephematyk, ta wbudowana biblioteka MATLAB jest również niedostępna w Octave, co może być kolejnym powodem, dla którego inne odpowiedzi są lepsze.

+0

To jest dobra odpowiedź! Jedynym minusem jest to, że nie jest kompatybilny z Octave (jeśli coś w tym stylu);) – stephematician

+0

@stephematyk dziękuję :) Dobra uwaga, wolę kompatybilność krzyżową co do zasady, ale nie jestem zbyt zaskoczona, że ​​to nie jest 't zastosowanie dla Octave, przepraszam :((i dziękuję, Luis;) –

4

Jak wspomina Luis Mendo (i jakoś tęskniłem za tym) uchwyt jest ukryty pod wszystkimi innymi funkcjami w swojej odpowiedzi, co będzie w większości sytuacji dobre, ale alternatywne rozwiązanie, które wygląda identycznie jak wyżej i nie ma ten efekt jest:

k_values = 1:3; 
h = nan(size(k_values)); 
x = 1:10; 

hold on 
for k = k_values 
    y = rand(size(x)); 
    y2 = y + 2; 
    h(k) = plot(x,y); 
    plot(x,y2,'--'); 
end 
hold off 

legend(h, strcat('data', num2str(k_values'))) 

komenda końcowy ustawia wpis legenda dla każdego uchwytu są zwracane przez komendę plot(x,y). Pierwszym argumentem jest tablica 1x3 uchwytów liniowych, które pojawią się w legendzie, a drugim argumentem jest macierz znaków 3x5, gdzie każdy wiersz jest etykietą.

+0

To powinno być najczystsze rozwiązanie, ponieważ nie opiera się na dokumentach pół-udokumentowanych i tylko manipuluje specjalnie generacją legendy –

+2

'legend (h, strcat (' data ', num2str (k_values.'))) 'działa dla mnie –

+4

Wystarczy podać oczywiste: istotą odpowiedzi jest fakt, że powinna zostać wygenerowana tablica' h' i 'legenda' w jakiejkolwiek praktycznej postaci; aplikacja utworzy tablicę znaków/komórkę dla swoich tekstów legendy i tak :) –