Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

Anwendungen der Linearen Algebra mit MATLAB

Studierende:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Boxchart - Farben einzelner Boxen ändern

 

Sören95
Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 12.01.21
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 03.03.2021, 12:33     Titel: Boxchart - Farben einzelner Boxen ändern
  Antworten mit Zitat      
Guten Tag,

ich habe ein Problem mit dem Erstellen eines Boxcharts. Die "boxchart"-Funktion scheint noch recht neu zu sein, ich habe zumindest relativ wenig dazu gefunden.
Mit meinem Code klappt das Erstellen der Box Charts schon ganz gut. Es entstehen insgesamt 11 Boxen nebeneinander. Ich frage mich nun, wie ich bei einzelnen Boxen die Farbe ändern kann?
Es gibt zu jedem Max Wert noch einen Min Wert, den ich noch hinzufügen werde. Die maximalen und die minimalen Werte sollen unterschiedliche Farben bekommen.

Code:

group = [ 26.26*ones(size(FargeMax));
    33.32*ones(size(ElsflMax));
    39.18*ones(size(BrakeMax));
    46.46*ones(size(RechtMax));
    50.52*ones(size(StrohMax));
    55.81*ones(size(NordenhMax));
    62.45*ones(size(BlexenMax));
    66.64*ones(size(BrALMax));
    79.94*ones(size(RobbMax));
    92.66*ones(size(DwarsMax));
    115*ones(size(LAWMax))   ];

b=boxchart(group, [FargeMax.Max; ElsflMax.Max; BrakeMax.Max; RechtMax.Max; StrohMax.Max;
    NordenhMax.Max; BlexenMax.Max; BrALMax.Max; RobbMax.Max; DwarsMax.Max; LAWMax.Max]);
b.JitterOutliers = 'on';
b.MarkerStyle = '.';
b.BoxWidth = 1.0;
b.MarkerSize = 4;
b.LineWidth = 0.8;

set(gcf, 'Position', [100 100 1000 500],'Color','w');
grid on; grid minor;
xlabel('[km]');
ylabel('Salzgehalt');

 


Aus der Matlab Hilfe habe ich folgendes gefunden, um die Farben der Boxen zu verändern:

Code:
b.BoxFaceColor = [0 0.5 0.5];


Damit lassen sich aber nur alle Boxen und ihre Farben verändern, das klappt soweit auch. Wie lassen sich aber einzelne Boxen verändern?

Besten Dank vorab für jede Antwort.
Private Nachricht senden Benutzer-Profile anzeigen


Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 695
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 03.03.2021, 13:27     Titel:
  Antworten mit Zitat      
Einfach veränderliche Variablen an den drei Positionen einsetzen.
Die lassen sich z.B. per Schleife verändern, oder man speichert bestimmte Werte vorab in einer MAtrix, oder...

Code:
b.BoxFaceColor = [c1 c2 c3];

_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
Sören95
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 12.01.21
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 03.03.2021, 13:48     Titel:
  Antworten mit Zitat      
Danke für die Antwort. Wie würde das dann funktionieren?
Ich stelle mir das so vor, dass jede Box, die aus einer Datei erstellt wurde, die das Wort "Max" enthält beispielsweise Farbe [0.8500 0.3250 0.0980] bekommt. Die Boxen, die aus einer Datei erstellt wurden, die das Wort "Min" enthalten dann zum Beispiel die Farbe [0 0.4470 0.7410] bekommen. Also in meinem ersten Code fehlen noch zu jeder Max Datei eine Min Datei, die ich dann noch hinzufügen werden.
Private Nachricht senden Benutzer-Profile anzeigen
 
Sören95
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 12.01.21
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 03.03.2021, 16:14     Titel:
  Antworten mit Zitat      
Also ich habe gerade noch einmal ein bisschen rumprobiert und vor allem die Dateien für die minimalen Werte hinzugefügt. Einen Fehler habe ich leider immer noch.
Mit folgendem Code werden insgesamt 22 Boxplots nebeneinander dargestellt und Farben verteilt:

Code:

t=1;     %Zur Verschiebung der Position der einzelnen Boxen
groupmax = [ 26.26-t*ones(size(FargeMax));           %maximale Werte
    33.32-t*ones(size(ElsflMax));
    39.18-t*ones(size(BrakeMax));
    46.46-t*ones(size(RechtMax));
    50.52-t*ones(size(StrohMax));
    55.81-t*ones(size(NordenhMax));
    62.45-t*ones(size(BlexenMax));
    66.64-t*ones(size(BrALMax));
    79.94-t*ones(size(RobbMax));
    92.66-t*ones(size(DwarsMax));
    115-t*ones(size(LAWMax))   ];

groupmin = [ 26.26+t*ones(size(FargeMin));           %minimale Werte
    33.32+t*ones(size(ElsflMin));
    39.18+t*ones(size(BrakeMin));
    46.46+t*ones(size(RechtMin));
    50.52+t*ones(size(StrohMin));
    55.81+t*ones(size(NordenhMin));
    62.45+t*ones(size(BlexenMin));
    66.64+t*ones(size(BrALMin));
    79.94+t*ones(size(RobbMin));
    92.66+t*ones(size(DwarsMin));
    115+t*ones(size(LAWMin))   ];

MaxMin=[repmat("Max", size(groupmax));        %Für die Einteilung der Farben
    repmat("Min", size(groupmin))];

group=[groupmax;                             %zusammenfügen der Gruppen
    groupmin];

b=boxchart(group, [FargeMax.Max; ElsflMax.Max; BrakeMax.Max; RechtMax.Max; StrohMax.Max;
    NordenhMax.Max; BlexenMax.Max; BrALMax.Max; RobbMax.Max; DwarsMax.Max; LAWMax.Max;
    FargeMin.Min; ElsflMin.Min; BrakeMin.Min; RechtMin.Min; StrohMin.Min;
    NordenhMin.Min; BlexenMin.Min; BrALMin.Min; RobbMin.Min; DwarsMin.Min; LAWMin.Min],'GroupByColor',MaxMin);

b.JitterOutliers = 'on';
b.MarkerStyle = '.';
b.BoxWidth = 1.0;
b.MarkerSize = 4;
b.LineWidth = 0.8;


set(gcf, 'Position', [100 100 1000 500],'Color','w');
grid on; grid minor;
xlabel('[km]');
ylabel('Salzgehalt');
 


Durch das GroupByColor werden die Farben richtig verteilt. Wie man diese nun selbst bestimmt weiß ich nicht, aber das ist auch nicht mein Hauptproblem. Die folgenden Zeilen ergeben nun eine Fehlermeldung. Vor der Einteilung mit den Farben hat das wunderbar funktioniert.

Code:

b.JitterOutliers = 'on';
b.MarkerStyle = '.';
b.BoxWidth = 1.0;
b.MarkerSize = 4;
b.LineWidth = 0.8;
 

Das hier ist die Meldung:
Code:
Expected one output from a curly brace or dot indexing expression, but there were 2 results.


Fällt euch da was zu ein? Ohne die Anpassung bringen mir die Farben nämlich leider auch nichts.
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 695
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 03.03.2021, 20:27     Titel:
  Antworten mit Zitat      
Schreibe obenerhalb deines Codes
Code:


Debugge, wo genau der Fehler liegt.
Im Zweifel auskommentieren und eine Zeile nach der anderen wieder dazu.
Da du kein Lauffähiges Minimalbeispiel hast kann so gerade nur geraten werden.
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
Sören95
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 12.01.21
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 04.03.2021, 14:55     Titel:
  Antworten mit Zitat      
Hallo Martina, vielen Dank für deine Antwort. Leider arbeite ich erst seit kurzem mit Matlab und kenne mich daher nicht so gut aus. Das erstellen der BoxCharts hat schon ganz gut funktioniert, mit dem Fehler finden, tue ich mich aber sehr schwer. Ich würde mich freuen, wenn sich jemand meinen Code nochmal angucken kann. Ich habe dazu den Code für ein Beispiel geschrieben.
Er beinhaltet drei Versuche den BoxChart zu erstellen:
1. Versuch: Mit einer Farbe, alles läuft perfekt
2. Versuch: Mit zwei Farben nach Gruppen geordnet, Farben werden richtig dargestellt, aber: Die BoxChart Properties (also z.B. b.JitterOutliers = 'on') ergeben eine Fehlermeldung
3. Versuch: Mit zwei Farben nach Gruppen geordnet, Farben werden richtig dargestellt, aber: Die BoxChart Properties (diesmal direkt in der BoxChart Zeile) werden nicht richtig dargestellt. Die Boxen vergrößern sich zwar, aber nicht auf die ursprüngliche Größe wie im ersten Versuch.
Und das stellt gerade mein Problem dar. In meinem eigentlichen Code, habe ich deutlich mehr Boxen nebeneinander. Wenn die Boxen dann so schmal sind, kommen diese kaum zur Geltung.




Code:

t=1;    %Zur Verschiebung der Position der einzelnen Boxen

r1 = rand(100,1);
r2 = rand(120,1)*1.2;
r3 = rand(140,1)*1.3;
r4 = rand(160,1)*1.6;

r5 = rand(110,1)*0.4;
r6 = rand(130,1)*0.5;
r7 = rand(150,1)*0.6;
r8 = rand(170,1)*0.8;

groupmax = [ 26.26-t*ones(size(r1));
    33.32-t*ones(size(r2));
    39.18-t*ones(size(r3));
    46.46-t*ones(size(r4));  ];

groupmin = [ 26.26+t*ones(size(r5));
    33.32+t*ones(size(r6));
    39.18+t*ones(size(r7));
    46.46+t*ones(size(r8));  ];

MaxMin=[repmat("Max", size(groupmax));
    repmat("Min", size(groupmin))];

group=[groupmax;
    groupmin];




%% Boxchart mit einer Farbe
% BoxChart Properties werden richtig dargestellt

b=boxchart(group, [r1; r2; r3; r4; r5; r6; r7; r8]);
b.JitterOutliers = 'on';
b.MarkerStyle = '.';
b.BoxWidth = 1.0;
b.MarkerSize = 4;
b.LineWidth = 0.8;
legend;


set(gcf, 'Position', [100 100 1000 500],'Color','w');

export_fig('1.png','-m4');



%% Boxchart mit zwei Farben, nach Gruppen geordnet
% BoxChart Properties ergeben Fehlermeldung
% Error: Expected one output from a curly brace or dot indexing expression, but there were 2 results.

b=boxchart(group, [r1; r2; r3; r4; r5; r6; r7; r8],'GroupByColor',MaxMin);
b.JitterOutliers = 'on';
b.MarkerStyle = '.';
b.BoxWidth = 1.0;
b.MarkerSize = 4;
b.LineWidth = 0.8;
legend;


set(gcf, 'Position', [100 100 1000 500],'Color','w');

export_fig('2.png','-m4');



%% Boxchart mit zwei Farben, nach Gruppen geordnet
% BoxChart Properties ergeben keine Fehlermeldung, laufen allerdings auch
% nicht richtig. BoxWidth vergrößert die Box, aber nicht so sehr, wie beim ürsprünglichen ersten Plot.

b=boxchart(group, [r1; r2; r3; r4; r5; r6; r7; r8],'GroupByColor',MaxMin,...
'JitterOutliers','on','BoxWidth',1,'MarkerSize',2,'MarkerStyle','.','LineWidth',0.8);


set(gcf, 'Position', [100 100 1000 500],'Color','w');

export_fig('3.png','-m4');

 


Ich freue mich über Hilfe.

Besten Dank vorab.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

neben der Fehlermeldung an sich ist die Zeile, die sie produziert, eine entscheidende Information. Bei dir war das die Zeile
Code:
b.JitterOutliers = 'on';

Wenn du das (entsprechend auch in den weiteren Zeilen) wie folgt anpasst, sollte es klappen.
Code:
set(b, 'JitterOutliers', 'on');


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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Sören95
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 12.01.21
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 05.03.2021, 11:38     Titel:
  Antworten mit Zitat      
Danke dir Harald für die Antwort. Das hat tatsächlich die Fehlermeldung gelöst, aber leider noch nicht mein Problem. Ich kann damit die Boxen anpassen, das klappt soweit gut.
Ich kann sie allerdings nicht auf die ursprüngliche Breite wie in dem Plot mit nur einer Farbe bringen. Um zu verdeutlichen was ich meine nochmal mein Beispiel von oben:

Code:

%Code um BoxChart im nächsten Schritt zu erstellen:

t=1;    %Zur Verschiebung der Position der einzelnen Boxen

r1 = rand(100,1);
r2 = rand(120,1)*1.2;
r3 = rand(140,1)*1.3;
r4 = rand(160,1)*1.6;

r5 = rand(110,1)*0.4;
r6 = rand(130,1)*0.5;
r7 = rand(150,1)*0.6;
r8 = rand(170,1)*0.8;

groupmax = [ 26.26-t*ones(size(r1));
    33.32-t*ones(size(r2));
    39.18-t*ones(size(r3));
    46.46-t*ones(size(r4));  ];

groupmin = [ 26.26+t*ones(size(r5));
    33.32+t*ones(size(r6));
    39.18+t*ones(size(r7));
    46.46+t*ones(size(r8));  ];

MaxMin=[repmat("Max", size(groupmax));
    repmat("Min", size(groupmin))];

group=[groupmax;
    groupmin];
 


Das kann ich jetzt plotten, ohne was an der Farbe zu ändern, mit folgendem Code:

Code:
%% Boxchart mit einer Farbe

b=boxchart(group, [r1; r2; r3; r4; r5; r6; r7; r8]);
set(b, 'JitterOutliers', 'on');
set(b, 'MarkerStyle','.');
set(b, 'BoxWidth',1);
set(b, 'MarkerSize',2);
set(b, 'LineWidth',0.8);
legend;


set(gcf, 'Position', [100 100 1000 500],'Color','w');

export_fig('10.png','-m4');


Wenn ich dann Farben nach den zwei erstellten Gruppen verteilen, kann man das auch super plotten, nur das mit folgendem Code die Boxen schmaler sind, als beim ersten Plot:

Code:
%% Boxchart mit zwei Farben, nach Gruppen geordnet

b=boxchart(group, [r1; r2; r3; r4; r5; r6; r7; r8],'GroupByColor',MaxMin);
set(b, 'JitterOutliers', 'on');
set(b, 'MarkerStyle','.');
set(b, 'BoxWidth',1);
set(b, 'MarkerSize',2);
set(b, 'LineWidth',0.8);
legend;


set(gcf, 'Position', [100 100 1000 500],'Color','w');

export_fig('11.png','-m4');



Ich weiß leider gar nicht woran das liegt, aber wenn die Farben einfach einheitlich dargestellt werden, sind die Boxen breiter.

Für mich ist das blöd, weil ich sehr viele Boxen nebeneinander darstellen will und die Boxen jetzt sehr schmal geworden sind. Vielleicht fällt da jemanden was zu ein, ansonsten muss ich mich damit zufrieden geben.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

hier habe ich leider auch keine Lösung.
Das naheliegende, BoxWidth zu vergrößern, ist nicht zulässig.

Daher würde ich vorschlagen, den Technischen Support von MathWorks zu kontaktieren.

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Sören95
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 12.01.21
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 05.03.2021, 12:23     Titel:
  Antworten mit Zitat      
Alles klar, danke! Damit kann ich auch schon mal was anfangen Wink

Falls sich da was ergibt, werde ich die Lösung hier posten. Ich setzte die Frage mal als "beantwortet".
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2021 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.