Verfasst am: 11.05.2021, 10:46
Titel: Farben in Legende nur einmal anzeigen
Hallo Zusammen,
ich habe folgende Frage: wie schaffe ich in Matlab bei einer Legende, dass die gleichen Farben nur einmal angezeigt werden.
Beispiel: Ich habe 10 Plots: 3 rote, 3 blaue und 4 grüne. Wenn ich nun die legende erstelle, erhalte ich 10 Einträge. Ich hätte aber gerne, dass Nur 3 Einträge in der Legende mit den 3 Farben angezeigt werden. Die Reihenfolge der Diagramme ist unregelmäßig, also es ist nicht immer klar, welche Positionen die jeweiligen Farben besitzen.
Ich hoffe, es ist verständlich beschrieben und freue mich auf Eure Antwort!
du kannst bei
legend
angeben, welchen Plot-Objekten du die Legende zuordnen willst. Siehe das Beispiel "Included Subset of Graphics Objects in Legend" aus der Doku.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
ja das habe ich schon gesehen, aber dafür muss man im voraus schon wissen welche Position welche Kurve hat.
Bei mir ist ehe so dass ich eine For-Schleife davor habe und je nach Situation erhalte einen Graph. Das Heißt es ist nicht immer Klar was p1, p2, p3 etc. entsprechen. Daher kann ich es nicht wie am Beispiel umsetzen.
_________________
wenn ich das so salopp sagen darf: wenn es für dich nicht immer klar ist, was p1, p2 etc. ist, wie soll es MATLAB oder mir klar sein?
Damit ich verstehe, was du hier genau meinst, ist wohl Beispiel-Code nötig.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
und nun? Was soll als Legende angezeigt werden? Alle 8 Farben? Die Farben, die mindestens einmal verwendet wurden?
Die Flächen werden doch (anscheinend - ausführbar ist der Code mangels Beispieldaten ja nicht) in jeder Iteration genau übermalt? Ist das wirklich sinnvoll?
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Ich habe ein Bild von der Legende angehängt. Da ist es zu sehen dass Klasse 7 5 mal erscheint. Nun hätte ich es gerne so, dass Klasse 7 nur einmal in der Legende dargestellt wird.
Ja das ist auch der Ziel, dass der Hintergrund übermalt wird
Da ist es zu sehen dass Klasse 7 5 mal erscheint. Nun hätte ich es gerne so, dass Klasse 7 nur einmal in der Legende dargestellt wird.
Das ist soweit klar, beantwortet aber nicht meine Frage: sollen alle 8 Farben oder nur die Farben, die mindestens einmal verwendet wurden, angezeigt werden?
Die ganze if-Anweisung sollte man sich übrigens schenken können, wenn man die Farben und FaceAlpha-Werte als Matrix bzw. Vektor anlegt und dann mit Table_Beispieltag.Option3 hinein indiziert.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
% Beispiel: % Table_Beispieltag.Option3 = randi(8, [10,1]);
klassenVorhanden = find(ismember(1:8, Table_Beispieltag.Option3));
for k = klassenVorhanden
p(k) = fill(NaN, NaN, colors(k,:),'FaceAlpha',fa(k),'EdgeColor', 'none','DisplayName',"Klasse "+k');
hold on
end hold off
legend('show')
Nach dem Prinzip kannst du auch deinen eigentlichen Code verschlanken.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
danke für den Tipp! es funktioniert mit den ganzen if-Schleifen Reduktion!
Allerdings ist das Problem mit der Legende immer noch vorhanden. Ich habe ein Bild angehängt wie es bei mir aussieht.
Die gleichen Farben werden mehrmals in der Legende aufgerufen!
% Beispiel:
Table_Beispieltag.Option3 = randi(8, [10,1]);
klassenVorhanden = find(ismember(1:8, Table_Beispieltag.Option3));
clear p
for k = 1:numel(klassenVorhanden)
klasse = klassenVorhanden(k);
p(k) = fill(NaN, NaN, colors(klasse,:),'FaceAlpha',fa(klasse),'EdgeColor', 'none','DisplayName',"Klasse "+klasse);
hold on
end hold off
legend(p, {p.DisplayName})
Du kannst übrigens den Code gerne auch anpassen. Das Prinzip sollte ja nun klar sein.
Da ich dein tatsächliches Beispiel nicht ausführen kann, hast du da deutlich mehr Möglichkeiten als ich.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
irgendwie klappt das in meinem Code nicht
Hier ist der gesamte Ausschnitt von meinem Code:
Code:
clc;
clearall;
anz = 1440;
startDate =datenum('2021-05-1700:00:00','yyyy-MM-dd HH:mm:ss');
d = zeros(anz, 1);
for k = 1 : anz
d(k)= startDate + k / (24 * 60);
end Datetime= datetime(datestr(d,'yyyy-MM-dd HH:mm:ss'), 'Format', 'yyyy-MM-dd HH:mm:ss');
Var_Optionen= randi([18], length(Datetime),1);
Table_Beispieltag= table(Datetime, Var_Optionen);
colors = randi([01],8,3); %RGB Werte für Plots
fa = ones(8,1)*0.3; %Tranzparenzwerte für Facealpha (Fill Plots) figure
klassenVorhanden = find(ismember(1:8, Table_Beispieltag.Var_Optionen));
for m = klassenVorhanden
for i = 1:height(Table_Beispieltag)
if Table_Beispieltag.Var_Optionen(i) == m
Date1 = datenum(Table_Beispieltag.Datetime(i));
Date2= datenum(Table_Beispieltag.Datetime(i+1));
Oben= [0;1200;1200;0;0];
Klasse= table([Date1;Date1;Date2;Date2;Date1],Oben);
Klasse.Var1= datetime(Klasse.Var1, 'ConvertFrom', 'datenum');
p(m) = fill(Klasse.Var1,Klasse.Oben, colors(m,:),'FaceAlpha',fa(m),'EdgeColor', 'none','DisplayName',"Klasse "+m');
end hold on
end end hold off
legend(p, {p.DisplayName})
der entscheidende Punkt ist, dass du meinen Code zusätzlich zu dem bestehenden Code einfügst (und so wie er ist). Die Plots mit NaN sind nicht sichtbar, erzeugen aber die gewünschten Legenden.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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.