im MatLab noch ein wenig neu habe ich ein Problem mit einer Legende in einem Plot.
Zunächst einmal der Code
Code:
figure(302) hold on;
for i=1:1:ceil(m/20) for k=1:1:20 if FHaufen((i*20-20+k),3)<=5 plot(FHaufen((i*20-20+k),2),FHaufen((i*20-20+k),4),[color(i) 'o']);
end end end title('Rechenzeit pro Population bei 5% Fehler in 100 Versuchen'); xlabel('Generationen');
ylabel('Rechenzeit [s]');
legh = legend(num2str(Pop),'Location','EastOutside');
set(get(legh,'title'),'String','Populationsgröße');
AXIS([0105000200]);
hold off;
Die Legende zeigt nicht wie gewohnt für jede Meßwertreihe die entsprechende Farbe an.
Ich vermute, dass dies daran liegt, dass der plot-Befehl die Legende steuert. Wie in der Schleife zu sehen wird dieser Befehl wesentlich öfter aufgerufen als es Meßreihen gibt. Dies ist notwendig, da ich mit der "if"-Bedingung nur die Meßwerte ploten will, die auch (in dem Fall) unter 5% liegen.
Es scheint, dass MatLab einfach zählt wie oft der Plot-Befehl aufgerufen wurde und dann eben die Legende (mit meinen String) zeichnet.
Kann man die Legende überreden das zu tun, was ich erwarte? :
Für jedes "i" (Meßreihe) genau ein Element zu bilden?
Ich hoffe es ist nicht zu kompliziert beschrieben...
Viele Grüße
BG
Zur Verdeutlichung habe ich im Anhang mal das derzeitige Ergebnis...
Was genau ist "num2str(Pop)"? Bist Du sicher, dass dies so gewollt ist?
Zitat:
Ich vermute, dass dies daran liegt, dass der plot-Befehl die Legende steuert. Wie in der Schleife zu sehen wird dieser Befehl wesentlich öfter aufgerufen als es Meßreihen gibt.
Welcher Befehl wird öfter aufgerufen als es Messreihen gibt? Es gibt mehr Messreihen als PLOT-Befehle. Aber LEGEND kümmert sich nur um die LINE Objekte, die im entsprechenden AXES Objekt liegen.
vielen Dank dass Du Dich diesem Thema annimmst. Ich habe einfach keine Idee mehr, was ich machen könnte. Vielleicht noch einmal zum Anlass des Plots:
Ich möchte gern aus verschiedenen Meßreihen nur die Elemente (Datenpunkte) ploten, die unter einer bestimmten Grenze liegen. Dazu hatte ich mir die (nicht so elegante) Schleife ausgedacht, in der immer wieder geprüft wird, ob die Grenze eingehalten ist. Danach wird dann wieder ein Datenpunkt geplottet (oderauch nicht).
Nun zu Deinen Fragen:
Zitat:
Was genau ist "num2str(Pop)"? Bist Du sicher, dass dies so gewollt ist?
Das "num2str(Pop)" wandelt nur einen Vektor, der Zahlen enthält um. Es sind genau so viele Zahlen wie Meßreihen, weil die so heissen. (die Messreihen) Und ja, das ist so gewollt - und funktioniert bei Plots, wo ich nix aussortiere auch einwandfrei.
Zitat:
Welcher Befehl wird öfter aufgerufen als es Messreihen gibt?
Der Plot-Befehl. Ich habe 9 Meßreihen á 20 Messwerte und der Plot-Befehl wird aber, verursacht die doppelte Schleife 9x20 wiederholt.
Zitat:
Aber LEGEND kümmert sich nur um die LINE Objekte, die im entsprechenden AXES Objekt liegen.
Keine Ahnung (noch nicht) was damit gemeint sein könnte
Läßt sich ggf eine Legende auch "einfach so" - ohne Datenbezug - erzeugen?
entschuldige bitte, dass ich erst heute antworten kann - ich war bei dem Wetter übers WE unterwegs...
Ich habe mal Dein Beispiel ausprobiert und bekomme die Fehlermeldung
Zitat:
??? Index exceeds matrix dimensions.
Error in ==> StatisticsGreenGA at 144
legend(HandleList(1:index), NameList(1:index));
Irgendwie ist bei mir die Variable "HandleList" kein Vektor sondern ein Skalar. Daher wahrscheinlich der Fehler.
Zitat:
Bist Du denn sicher, dass "Pop" genauso viele Elemente enthält, wie PLOT-Kommandos ausgeführt wurden? Probier mal "num2str(Pop)" wegzulassen.
Genau da liegt ja der Hase im Pfeffer. Ich habe genau so viele Elemente in "Pop" wie ich Messreihen habe. Aber der Plot-Befehl wird eben viel öfter ausgeführt.
Wie schon mal versucht anzudeuten: Ich habe 20 Messreihen mit je 20 Messwerten.
Wenn ich diese komentarlos plotte, dann funktioniert alles einwandfrei:
Code:
figure(300) hold on;
for i=1:1:ceil(m/20) plot(FHaufen(1:20,2),FHaufen(i*20-19:20+(20*(i-1)),4),[color(i) lineart(i)]);
Pop(i) = FHaufen(i*20-19,1);
end title('Rechenzeit für einen Versuch pro Population');
xlabel('Generationen');
ylabel('Rechenzeit [s]');
legh = legend(num2str(Pop),'Location','EastOutside');
set(get(legh,'title'),'String','Populationsgröße');
AXIS([0105000220]) hold off;
Nun habe ich aber Messwerte, die meinen (Fehler)Kriterien nicht entsprechen. Diese sollen nun nicht mehr im Plot erscheinen. Also habe ich die Schleife gebastelt, in der jeder Messpunkt einzeln geplottet (und gleichzeitig geprüft) wird.
Damit habe ich nun grob gerechnet 20x20=400 Plot-Befehle.
Wenn ich keine Legende erstelle, dann sieht das Ganze auch gut aus. Nur eben die Legende ist falsch.
Hast Du da noch eine Idee? Vielleicht kann ich ja mein Problem auch wesentlich einfacher lösen?
In Deinem Code kannst Du die Namen in "Pop" einfach ebenfalls aussortieren:
Code:
shown = false(1, m);
hold on;
for i = 1:ceil(m/20) for k = 1:20 if FHaufen((i*20-20+k),3)<=5
shown(i*20-20+k) = true;
plot(FHaufen((i*20-20+k),2),FHaufen((i*20-20+k),4),[color(i) 'o']);
end end end
legh = legend(num2str(Pop(shown)),'Location','EastOutside');
hold off;
So langsam scheint mir aber klar zu werden, was Du vorhast. Du willst nur die tatsächlich geplotteten Datenpunkte in einem Vektor registrieren und den an die Legende übergeben. Richtig?
In meinem Vektor "Pop" stehen die Namen der Reihen (Zahlen):
500
1000
1500
2000
2500
3000
3500
4000
4500
5000
Die werden ja schon immer ganz brav in der Legende verarbeitet, da ja alle Messreihen mindestens einmal vertreten sind.
ABER: die zugehörigen Farben eben nicht. MatLab scheint die Farben nach Auftreten der Messwerte (und eben nicht nach Messwertreihen..) zu vergeben. Und da die erste Messwertreihe n Zahlenwerte zu plotten hat, taucht diese "Plottung" genau n-fach in der Legende auf. Und besetzt damit die Farben, die aber nicht zu den Mssreihennamen in "Pop" gehören.
Ich müsste MatLab irgendwie überreden können die Farben nach meinem Duktus zu vergeben....
MatLab scheint die Farben nach Auftreten der Messwerte (und eben nicht nach Messwertreihen..) zu vergeben.
Messwerte? Messwertreihe? Verstehe ich nicht.
Matlab vergibt die Farben in der Legende nach den übergebenen LINE-Handles. Wenn Du keine LINE-Handles als Input verwendest, sucht es in dem übergebenen AXES-Handle nach allen enthaltenen Objekten. Wenn Du keinen AXES-Handle übergibst, sucht es im "CurrentAxes"-Objekt der aktuellen FIGURE.
Deshalb ist es am einfachsten, Du übergibst die Handles der Objekte (also Linien *oder* Punkte, ganz wie Du magst) und einen Cell-String mit dazugehörigen Namen. Ein weiteres Beispiel:
so langsam kommen wir auf den richtigen Weg. Dein Beispiel ist nun schon fast das, was ich brauche. Wenn Du es nun noch hinbekommst, dass von "Line 1" nur alle Datenpunkte mit einem Wert von über 0.75 und von "Line 3" nur alle Datenpunkte mit einem Wert von unter 0.25 geplottet werden, dann ist es genau das was ich meine.
Es sind dann zwei Datenreihen (Line 1, Line 3) von denen nur bestimmte, ausgesuchte Punkte geplottet werden.
Naja und eben die Legende ist bei mir das Problem...
Um gleich darauf einzugehen: Vielleicht bin ich auch nur zu unwissend - aber kann man einen Zahlenvektor mit einer "Leerstelle" (also eine, die nicht im Plot erscheint) versehen?
Wenn nicht, wie kann sichergestellt werden, dass dann die "Messwerte" an der richtige Stelle im Plot stehen?
Um nun endlich mal Nägel mit Köpfen zu machen und nicht mehr lange herumzutrödeln: Also ich habe den Datenvektor angehangen in dem in der ersten Spalte die Messreihe (z.B. 500, 1000, 1500 usw) steht. In der zweiten Spalte steht eine Fehlerhäufigkeit.
Wenn diese kleiner 10 ist, dann soll ein "Kringel" ('o') im Plot erscheinen. Falls größer, dann nicht.
Ist zwar jetzt ein bisschen mit der Tür ins Haus, aber ich möchte Dir nicht noch mehr Zeit mit wenig qualifizierten Fragen stehlen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.