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

"Dynamische" Legende mit Gruppierung mehrer Punkte

 

JaSoIstEs
Forum-Guru

Forum-Guru


Beiträge: 266
Anmeldedatum: 01.10.12
Wohnort: Hessen
Version: 2019b
     Beitrag Verfasst am: 20.03.2015, 08:59     Titel: "Dynamische" Legende mit Gruppierung mehrer Punkte
  Antworten mit Zitat      
Hallo Leute,

ich brauch mal wieder Hilfe.

Habe einen Code der eine Simulation/Berechnung eines Externen Programms startet diese Daten werden in Matlab eingeholt und verarbeitet.

Während der Berechnung habe ich zwei Subplots die mir im Prinzip den "aktuellen" Status und einige Daten anzeigt. Alles dynamisch.

Mein Problem ist jetzt das ich eine Legende brauche für einen bestimmten Plot. Dieser Plot zeigt mir die Effizienz mittels "o" an jede "Grenze" hat eine Farbe. Hier bräuchte ich eine Gruppierung sprich wenn ich 10 mal die Effizient mit dem Wert 70 habe will ich nicht das ich 10 mal das selbe in der Legende sehe.

Hab schon einige Versuche gestartet aber kam zu keinem anständigen Ergebnis.

Mein Plot Code sieht so aus (nichts besonderes):
Code:

if GrphOut == 1
        figure(h)
        axes(hi)
        hold on
        for i = 1:size(Nprv,1)
            if     Eprv(i) >= 0.950
                plot(Nprv(i), Tprv(i), 'ro');
            elseif Eprv(i) >= 0.900
                plot(Nprv(i), Tprv(i), 'bo');
            elseif Eprv(i) >= 0.850
                plot(Nprv(i), Tprv(i), 'go');
            elseif Eprv(i) >= 0.800
                plot(Nprv(i), Tprv(i), 'mo');
            elseif Eprv(i) >= 0.750
                plot(Nprv(i), Tprv(i), 'co');
            else
                plot(Nprv(i), Tprv(i), 'yo');
            end
        end
        xlabel('Speed in p.u.')
        ylabel('Torque in p.u.')
        title('Efficiency')
        drawnow
        axes(hj)
        hold on
        for i = 1:size(Nprv,1)
            if     Iprv(i) >= 0.950
                plot(Nprv(i), Tprv(i), 'ro')
            elseif Iprv(i) >= 0.900
                plot(Nprv(i), Tprv(i), 'bo')
            elseif Iprv(i) >= 0.850
                plot(Nprv(i), Tprv(i), 'go')
            elseif Iprv(i) >= 0.800
                plot(Nprv(i), Tprv(i), 'mo')
            elseif Iprv(i) >= 0.750
                plot(Nprv(i), Tprv(i), 'co')
            else
                plot(Nprv(i), Tprv(i), 'yo')
            end
        end
        xlabel('Speed in p.u.')
        ylabel('Torque in p.u.')
        title('Current')
        drawnow
        % axes(hk)
        % hold on
        % for i = 1:size(Nprv,1)
        %    if     Vprv(i) >= 0.950
        %        plot(Nprv(i), Tprv(i), 'ro')
        %    elseif Vprv(i) >= 0.900
        %        plot(Nprv(i), Tprv(i), 'bo')
        %    elseif Vprv(i) >= 0.850
        %        plot(Nprv(i), Tprv(i), 'go')
        %    elseif Vprv(i) >= 0.800
        %        plot(Nprv(i), Tprv(i), 'mo')
        %    elseif Vprv(i) >= 0.750
        %        plot(Nprv(i), Tprv(i), 'co')
        %    else
        %        plot(Nprv(i), Tprv(i), 'yo')
        %    end
        % end
        % xlabel('Speed in p.u.')
        % ylabel('Torque in p.u.')
        % title('Voltage')
        % drawnow
    end
end
 


Hab auch schon einen Versuch mit "DisplayName" gestartet leider sieht das Ergebnis wie im Anhang aus.

Eine andere Möglichkeit oder erstmal ausreichende Lösung wäre wenn ich eine statische Legende bzw. eine "TextBox" hätte die immer vorhanden wäre d.h. nicht Graphen bzw. Datensatz abhängig.


Ich danke euch im Voraus.

Legende.PNG
 Beschreibung:

Download
 Dateiname:  Legende.PNG
 Dateigröße:  36.84 KB
 Heruntergeladen:  335 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.03.2015, 09:49     Titel:
  Antworten mit Zitat      
Hallo,

bei legend kannst du angeben, für welche Plot-Objekte die Legende erstellt werden soll. Beispiel:
Code:
x = 1:5;
hold on
p(1) = plot(x, x, 'bo-', 'DisplayName', 'x');
p(2) = plot(x, x.^2, 'go-',  'DisplayName', 'x^2');
p(3) = plot(x, x.^3, 'ro-',  'DisplayName', 'x^3');
p(4) = plot(x, x.^4, 'mo-',  'DisplayName', 'x^4');
hold off
legend(p([2 4]))


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
JaSoIstEs
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 266
Anmeldedatum: 01.10.12
Wohnort: Hessen
Version: 2019b
     Beitrag Verfasst am: 20.03.2015, 10:59     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich danke dir für deine schnelle Antwort.

Habe meinen Code wie folgt geändert:

Code:


...

    if GrphOut == 1
        figure(h)
        axes(hi)
        hold on
        for i = 1:size(Nprv,1)
            if     Eprv(i) >= 0.950
                p(1) = plot(Nprv(i), Tprv(i), 'ro', 'DisplayName', '>= 95');
            elseif Eprv(i) >= 0.900
                p(2) = plot(Nprv(i), Tprv(i), 'bo', 'DisplayName', '>= 90');
            elseif Eprv(i) >= 0.850
                p(3) = plot(Nprv(i), Tprv(i), 'go', 'DisplayName', '>= 85');
            elseif Eprv(i) >= 0.800
                p(4) = plot(Nprv(i), Tprv(i), 'mo', 'DisplayName', '>= 80');
            elseif Eprv(i) >= 0.750
                p(5) = plot(Nprv(i), Tprv(i), 'co', 'DisplayName', '>= 75');
            else
                p(6) = plot(Nprv(i), Tprv(i), 'yo', 'DisplayName', '< 75');
            end
        end
       
        hold off
        legend(p([6 size(Nprv,1]))
        xlabel('Speed in p.u.')
        ylabel('Torque in p.u.')
        title('Efficiency')
        drawnow
...

 


Die Berechnung läuft die ersten Kreise erscheinen im Plot aber keine Legende... Die Berechnung läuft weiter und irgendwann bekomme ich folgende Fehlermeldung:
___________________________
Index exceeds matrix dimensions.

Error in bac_ectr_main (line 407)
legend(p([6 size(Nprv,1)]))
___________________________

Versteh ich das richtig in deinem Beispiel ist die "2" die Anzahl der Einträge in der Legende für "4" Graphen oder ?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.03.2015, 13:32     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Versteh ich das richtig in deinem Beispiel ist die "2" die Anzahl der Einträge in der Legende für "4" Graphen oder ?

Nein, [2 4] sind die Indizes der Plots, für die die Legende angezeigt werden soll. Ich möchte da also die Legende für den 2. und den 4. Plot sehen.

Wenn du das Beispiel (z.B. mit Dummy-Daten) lauffähig machen kannst, wäre das sehr hilfreich.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
JaSoIstEs
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 266
Anmeldedatum: 01.10.12
Wohnort: Hessen
Version: 2019b
     Beitrag Verfasst am: 20.03.2015, 14:50     Titel:
  Antworten mit Zitat      
So wie es im Code läuft ist es glaube ich schwierig kurz zu halten.
Der Ablauf ist folgend:
-Ersten Arbeitspunkt angeben
-Werte an Externes Programm
-Werte von Externes Programm holen
-Werte werden je nach Wert in eine bestimmte Farbe geplottet
-Dann kommt der nächste Arbeitspunkt
-Hier folgen dann die selben Arbeitsschritte wie oben
usw.

Hier ein ungefähres statisches Beispiel:

Code:

a = 0.5;
b = 1;
Eprv = (b-a).*rand(100,1) + a;

a1 = 0;
b1 = 10;
Nprv = (b-a).*rand(100,1) + a;

a2 = 5;
b2 = 15;
Tprv = (b-a).*rand(100,1) + a;
figure
hold on

for i = 1:100
    if     Eprv(i) >= 0.950
        plot(Nprv(i), Tprv(i), 'ro');
    elseif Eprv(i) >= 0.900
        plot(Nprv(i), Tprv(i), 'bo');
    elseif Eprv(i) >= 0.850
        plot(Nprv(i), Tprv(i), 'go');
    elseif Eprv(i) >= 0.800
        plot(Nprv(i), Tprv(i), 'mo');
    elseif Eprv(i) >= 0.750
        plot(Nprv(i), Tprv(i), 'co');
    else
        plot(Nprv(i), Tprv(i), 'yo');
    end
end
xlabel('Speed in p.u.')
ylabel('Torque in p.u.')
title('Efficiency')
 


Das wird halt mehrere male durchgegangen und die Punkte im Prinzip "gesammelt".

reicht das als Beispiel ?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.03.2015, 15:26     Titel:
  Antworten mit Zitat      
Hallo,

und wie soll die Beschriftung tatsächlich aussehen?
Schau dir doch auch mal scatter (mit 4 Argumenten) oder gscatter (aus Statistics Toolbox) an. Dort sind solche Möglichkeiten ja schon vorgefertigt. Das sollte dann auch deutlich schneller gehen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
JaSoIstEs
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 266
Anmeldedatum: 01.10.12
Wohnort: Hessen
Version: 2019b
     Beitrag Verfasst am: 20.03.2015, 15:52     Titel:
  Antworten mit Zitat      
Hallo,

Legende soll wie folgend aussehen:
__________
'ro' >=0.95
'go' .........
'yo'.........
etc.
__________


aber jeweils nur einmal d.h. wenn ich 10 von den roten Kreisen habe dann soll das nicht 10 mal in der Legende stehen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.03.2015, 16:09     Titel:
  Antworten mit Zitat      
Hallo,

in Abwandlung deines Codes:
Code:
a = 0.5;
b = 1;
Eprv = (b-a).*rand(100,1) + a;

a1 = 0;
b1 = 10;
Nprv = (b-a).*rand(100,1) + a;

a2 = 5;
b2 = 15;
Tprv = (b-a).*rand(100,1) + a;
figure
hold on

for i = 1:100
    if     Eprv(i) >= 0.950
        p(1) = plot(Nprv(i), Tprv(i), 'ro');
    elseif Eprv(i) >= 0.900
        p(2) = plot(Nprv(i), Tprv(i), 'bo');
    elseif Eprv(i) >= 0.850
        p(3) = plot(Nprv(i), Tprv(i), 'go');
    elseif Eprv(i) >= 0.800
        p(4) = plot(Nprv(i), Tprv(i), 'mo');
    elseif Eprv(i) >= 0.750
        p(5) = plot(Nprv(i), Tprv(i), 'co');
    else
        p(6) = plot(Nprv(i), Tprv(i), 'yo');
    end
end
xlabel('Speed in p.u.')
ylabel('Torque in p.u.')
title('Efficiency')
legend(p, '>= 0.950', '>= 0.900', '>= 0.850', '>= 0.800',  '>= 0.750', '< 0.750')


Ich hatte ja auch scatter bzw. gscatter vorgeschlagen:
Code:
figure
Eprv = discretize(Eprv, [0 0.75 0.8 0.85 0.9 0.95 1], 'categorical', ...
    {'< 0.750', '>= 0.750', '>= 0.800', '>= 0.850', '>= 0.900', '>= 0.950' });
gscatter(Nprv, Tprv, Eprv, 'ycmgbr', 'o')
xlabel('Speed in p.u.')
ylabel('Torque in p.u.')
title('Efficiency')
legend(p, '>= 0.950', '>= 0.900', '>= 0.850', '>= 0.800',  '>= 0.750', '< 0.750')


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
JaSoIstEs
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 266
Anmeldedatum: 01.10.12
Wohnort: Hessen
Version: 2019b
     Beitrag Verfasst am: 23.03.2015, 08:17     Titel:
  Antworten mit Zitat      
Guten Morgen,

Danke für deinen Vorschlag, funktioniert auch problemlos im Minimalbeispiel,
aber leider nicht in meinem Code selber.

Bekomme folgenden Fehler:
_________________________________________________________
Error using legend (line 204)
Handle must be an axes or child of an axes.

Error in bac_ectr_main (line 316)
legend(p, '>= 0.950', '>= 0.900', '>= 0.850', '>= 0.800', '>= 0.750', '< 0.750')


Error in BacEctrAct>runsim (line 905)
bac_ectr_main(FieldWeak, data);

Error in BacEctrAct (line 10)
runsim

Error while evaluating uicontrol Callback
_________________________________________________________
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.03.2015, 09:49     Titel:
  Antworten mit Zitat      
Hallo,

der Fehler wird daran liegen, wie du p definierst. Um genaueres zu sagen, müsste ich den relevanten Code sehen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
JaSoIstEs
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 266
Anmeldedatum: 01.10.12
Wohnort: Hessen
Version: 2019b
     Beitrag Verfasst am: 23.03.2015, 10:39     Titel:
  Antworten mit Zitat      
Ich hab den Code eigentlich 1 zu 1 in meinen Code übernommen bis auf diesen Part:
Code:
a = 0.5;
b = 1;
Eprv = (b-a).*rand(100,1) + a;

a1 = 0;
b1 = 10;
Nprv = (b-a).*rand(100,1) + a;

a2 = 5;
b2 = 15;
Tprv = (b-a).*rand(100,1) + a;
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.03.2015, 10:48     Titel:
  Antworten mit Zitat      
Hallo,

mit diesen Informationen kann man dir leider nicht weiterhelfen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
JaSoIstEs
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 266
Anmeldedatum: 01.10.12
Wohnort: Hessen
Version: 2019b
     Beitrag Verfasst am: 23.03.2015, 11:10     Titel:
  Antworten mit Zitat      
Hallo,

so sieht der Code bei mir aus.

Code:

figure(h)
    axes(hi)
    hold on
    for i = 1:size(Nprv,1)
        if     Eprv(i) >= 0.950
           p(1) = plot(Nprv(i), Tprv(i), 'ro')
        elseif Eprv(i) >= 0.900
            p(2) = plot(Nprv(i), Tprv(i), 'bo')
        elseif Eprv(i) >= 0.850
            p(3) = plot(Nprv(i), Tprv(i), 'go')
        elseif Eprv(i) >= 0.800
            p(4) = plot(Nprv(i), Tprv(i), 'mo')
        elseif Eprv(i) >= 0.750
            P(5) = plot(Nprv(i), Tprv(i), 'co')
        else
            p(6) = plot(Nprv(i), Tprv(i), 'yo')
        end
    end
    xlabel('Speed in p.u.')
    ylabel('Torque in p.u.')
    title('Efficiency')
    legend(p,'1','2','3','4','5','6')
    drawnow


Nur der Daten-Input sieht halt anders aus aber das dürfte ja an sich eigentlich keine Probleme machen. Dieser Code wird halt nur mehrmals durchlaufen. Ich habe z.B. 100 Arbeitspunkte die ich durchlaufe und nach jedem Arbeitspunkt wird dieser code durchlaufen und die einzelnen Punkte geplottet. Sobald die Berechnung aller Punkte abgeschlossen ist schließt sich das Fenster bzw. Figure. Es dient lediglich zur Veranschaulichung der Berechnung/Simulation.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.03.2015, 20:07     Titel:
  Antworten mit Zitat      
Hallo,

ich kann mir leider auch nicht erklären, warum sich das nicht auf deine Daten übertragen lässt. Letztlich muss es ja einen Unterschied zwischen dem Minimalbeispiel und dem tatsächlichen geben. Ich kann mit den vorhandenen Informationen keinen solchen Unterschied erkennen.
Ideal für weitere Unterstützung wäre es, wenn du ein Beispiel liefern kannst, in dem das gleiche Problem auftritt.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
JaSoIstEs
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 266
Anmeldedatum: 01.10.12
Wohnort: Hessen
Version: 2019b
     Beitrag Verfasst am: 24.03.2015, 11:28     Titel:
  Antworten mit Zitat      
Ja das ist verständlich, leider kriege ich den Fehler außerhalb des ganzen nicht reproduziert.

Ich hab den Code selber etwas umgeschrieben bzw. umgestellt.
sodass ich es näher an meinen Code bringen kann.

Wie bekomme ich die Legende während die Punkte gezeichnet werden erstellt.
Sprich ich will die Legende nicht erst am Ende angezeigt bekomme.

Code:

a = 0.5;
b = 1;
Eprv = (b-a).*rand(500,1)+a;

a1 = 0;
b1 = 10;
Nprv = (b1-a1).*rand(500,1)+a1;

a2 = 5;
b2 = 15;
Tprv = (b2-a2).*rand(500,1)+a2;

figure
hold on
xlabel('Speed in p.u.')
ylabel('Torque in p.u.')
title('Efficiency')
for i = 1:500
    if Eprv(i) >= 0.950
        p(1) = plot(Nprv(i), Tprv(i),'ro');
    elseif Eprv(i) >= 0.900
        p(2) = plot(Nprv(i), Tprv(i),'bo');
    elseif Eprv(i) >= 0.850
        p(3) = plot(Nprv(i), Tprv(i),'go');
    elseif Eprv(i) >= 0.800
        p(4) = plot(Nprv(i), Tprv(i),'mo');
    elseif Eprv(i) >= 0.750
        p(5) = plot(Nprv(i), Tprv(i),'co');
    else
        p(6) = plot(Nprv(i), Tprv(i),'yo');
    end
    drawnow
end
legend(p,'>=0.950','>=0.900','>=0.850','>=0.800','>=0.750','<0.750')
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.