2012-05-24 4 views
9

Ich zeichne Daten in einem typischen MATLAB-Scatterplot-Format. Normalerweise, wenn mehrere Datensätze Plotten, würde ich den Befehl ‚festhalten,‘ verwenden, und dann jedes der Daten plotten hinzu, gefolgt von meiner Legende zu bekommen:MATLAB-Plot: Zuweisung von Legendenbeschriftungen während Plot

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

jedoch die (mehrfach) Datensätze Ich bin Plotten auf den gleichen Achsen sind nicht immer die gleichen Datensätze jedes Mal. Ich zeichne bis zu sechs verschiedene Sätze von Daten auf den gleichen Achsen, und es könnte eine beliebige Kombination von diesen gezeigt werden (abhängig davon, was der Benutzer auswählen möchte). Offensichtlich wäre das eine Menge anderes, wenn ich die Legende auf die traditionelle Art aufbauen wollte.

Was ich wirklich tun möchte ist, jedem DataSet einen Namen zu geben, wie es geplottet wird, so dass ich danach nur eine Legende aller Daten aufrufen kann, die angezeigt werden.

... Oder irgendeine andere Lösung für dieses Problem, an die jeder denken kann ..?

Antwort

11

Eine Option Vorteil der 'UserData' Eigenschaft wie so zu nehmen ist:

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: Wie der Fragesteller die ursprüngliche Version wies darauf hin, konnte außer Betrieb geraten. Um dies zu beheben, geben Sie an, welches Handle zu welcher Marke gehört (in der festen Version in der richtigen Reihenfolge).

+0

Diese Methode scheint die Farben und Namen zu verwechseln ... Es sei denn, ich implementiere es falsch? – CaptainProg

+0

was meinst du genau ... Ah, ich verstehe. Ok, probiere die neue Version aus! – tmpearce

+0

Fantastisch. Vielen Dank. – CaptainProg

3

Sie können so etwas wie die folgenden

versuchen
for k = 1:10 

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

end 

legend(h, name); 
+0

Das funktioniert auch. – CaptainProg

18

Sie sollten in der Lage sein, die Eigenschaft Displayname für jede Parzelle zu setzen:

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

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

Seite Anmerkung: Ich habe viele kleine Tricks wie diese, indem man die Figur findet die aussehen wie ich will, dann wählen Sie die "Datei" -Menüoption der Figur "M-File generieren ..." und überprüfen den generierten Ausgabecode.

+0

gute Randnotiz! –

10

Verwenden 'DisplayName' als plot() Eigenschaft, und der Legende nennen als

legend('-DynamicLegend'); 

Mein Code sieht wie folgt aus:

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 

Quelle: http://undocumentedmatlab.com/blog/legend-semi-documented-feature/

+3

Diese oder Jonathan's Antwort sollte die akzeptierten sein! – Ela782

0

Machen Sie eine for-Schleife. Aber machen Sie vor der for-Schleife ein Array.

%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).