WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Legende bringt falsche Farbwerte

 

Barny.G
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 17.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.03.2011, 16:03     Titel: Legende bringt falsche Farbwerte
  Antworten mit Zitat      
Hallo liebe Leute,

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([0 10500 0 200]);
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...

Plot01.jpg
 Beschreibung:

Download
 Dateiname:  Plot01.jpg
 Dateigröße:  29.22 KB
 Heruntergeladen:  879 mal
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 17.03.2011, 22:28     Titel: Re: Legende bringt falsche Farbwerte
  Antworten mit Zitat      
Hallo Barny,

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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Barny.G
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 17.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.03.2011, 14:00     Titel:
  Antworten mit Zitat      
Hallo Jan,

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) Smile 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 Confused

Läßt sich ggf eine Legende auch "einfach so" - ohne Datenbezug - erzeugen?

Viele Grüße

BG
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 18.03.2011, 21:55     Titel:
  Antworten mit Zitat      
Hallo Barny,

Bist Du denn sicher, dass "Pop" genauso viele Elemente enthält, wie PLOT-Kommandos ausgeführt wurden? Probier mal "num2str(Pop)" wegzulassen.

Ich gebe mal ein Beispiel:
Code:

HandleList = zeros(1, 40);
NameList = cell(1, 40);
index = 0;
for i = 1:40
  if rand < 0.9
    index = index + 1;
    HandleList = plot(i + rand(1, 10), 'Color', rand(1, 3));
    NameList{index} = sprintf('%d', index);
  end
end

legend(HandleList(1:index), NameList(1:index));
 

Funktioniert das?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Barny.G
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 17.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.03.2011, 11:04     Titel:
  Antworten mit Zitat      
Hallo Jan,

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([0 10500 0 220])
hold off;

Siehe bitte auch das Bild im Anhang dazu...

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?

Vielen Dank für Deine Geduld!!

BG

Plot_Legende_falsch.jpg
 Beschreibung:

Download
 Dateiname:  Plot_Legende_falsch.jpg
 Dateigröße:  29.3 KB
 Heruntergeladen:  868 mal
Plot_i_O.jpg
 Beschreibung:

Download
 Dateiname:  Plot_i_O.jpg
 Dateigröße:  31.56 KB
 Heruntergeladen:  845 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Barny.G
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 17.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.03.2011, 17:47     Titel:
  Antworten mit Zitat      
... hochschieb ... Embarassed
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 24.03.2011, 23:07     Titel: Re: Legende bringt falsche Farbwerte
  Antworten mit Zitat      
Hallo Barny.G,

In der Tat: Ich habe einen Index in meinem Beispiel vergessen:
Code:
HandleList(i) = plot(i + rand(1, 10), 'Color', rand(1, 3));

Damit läuft's dann - hoffentlich.

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;
 

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Barny.G
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 17.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.03.2011, 14:24     Titel:
  Antworten mit Zitat      
Hallo Jan,

sogleich habe ich Deinen von Dir korrigierten Code ausprobiert und bekomme leider immer noch Fehler:
Zitat:
??? Error using ==> legend>process_inputs at 561
Invalid argument. Type 'help legend' for more information.

Error in ==> legend>make_legend at 319
[orient,location,position,children,listen,strings,propargs] = process_inputs(ha,argin);

Error in ==> legend at 276
[h,msg] = make_legend(ha,varargin(arg:end));


Ich poste mal den Beispielcode, so wie er sich jetzt darstellt. Vielleicht habe ich ja einfach was falsch verstanden und ebenso zusammengesetzt.
Code:
HandleList = zeros(1, 40);
NameList = cell(1, 40);
index = 0;
for i = 1:40
  if rand < 0.9
    index = index + 1;
    HandleList(i) = plot(i + rand(1, 10), 'Color', rand(1, 3));
    NameList{index} = sprintf('%d', index);
  end
end

legend(NameList(1:index),HandleList(1:index));


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

Hast Du vielleicht (noch) eine Idee? Smile

Viele Grüße

BG
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 25.03.2011, 15:00     Titel:
  Antworten mit Zitat      
Hallo Barny.G,

Zitat:
Code:
legend(NameList(1:index),HandleList(1:index));

Nein, zuerst den Handle, dann den Namen:
Code:
legend(HandleList(1:index), NameList(1:index));


Zitat:
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:
Code:
figure;
hold('on');
h(1) = plot(rand(1, 10), 'Color', rand(1, 3));
h(2) = plot(rand(1, 10), 'Color', rand(1, 3));
h(3) = plot(rand(1, 10), 'Color', rand(1, 3));
legend(h([1, 3]), {'Line1', 'Line3'})

Damit wird die zweite Line gezeichnet, erscheint aber nicht in der Legende.
Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Barny.G
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 17.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.03.2011, 15:01     Titel:
  Antworten mit Zitat      
Hallo Jan,

so langsam kommen wir auf den richtigen Weg. Very Happy 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 Embarassed

Kannst Du mir nur noch ein letztes(?) Mal helfen?

Viele Grüße

BG

Data.txt
 Beschreibung:

Download
 Dateiname:  Data.txt
 Dateigröße:  6.64 KB
 Heruntergeladen:  433 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Barny.G
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 17.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.04.2011, 15:50     Titel: Idee gesucht...
  Antworten mit Zitat      
... hochschieb ... Embarassed
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.04.2011, 21:45     Titel:
  Antworten mit Zitat      
Hallo Barny.G,

Code:
y = rand(1, 40);
y(y > 0.4) = NaN;
plot(y);

Wenn es nicht um Linien, sondern um Punkte geht, funktionuert auch dies:
Code:
y = rand(1, 20);
plot([1:10, 21:26, 47:50], y, 'o');

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Barny.G
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 17.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.04.2011, 13:06     Titel:
  Antworten mit Zitat      
Hallo Jan;

SUPERKLASSE!!!! Very Happy Funktioniert einwandfrei! Idea

D A N K E !!!

BG
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.