Ich möchte einen Säulen (Bar) Graph, der stacked und grouped ist

Hallo liebes Forum!
Ich habe folgendes Problem.
Ich habe mit einem Online Tool https://www.energieinstitut.at/tools/susi/ Graphen erstellt und ich möchte die Säulen Diagramme in Matlab mit meinen eigenen Daten abbilden.
Folgendes Diagramm als Bsp:
Wie man erkennen kann, wird der "Haushaltsstrom" als eine eigene Säule dargestellt neben den aufgestapelten Daten "Direktnutzung", "Batterieentladung" und "Strombezug".
Das alles wird zum Datum gruppiert.
Das Datum liegt bei mir als datetime Variable (Array?) 'Date' vor, dies soll als x-Achse dienen.
Die restlichen Daten habe ich in eine Matrix 'mat' gepackt.
Als Säulendiagramm mit dem Befehl "bar()" bekomme ich das angezeigt, halt aber nur gruppiert oder aufgestapelt, daher habe ich mir das Skrip "plotBarStackGroups.m" geholt und komme da aber nicht weiter.
Wie bekomme ich das in Matlab hin?
Anbei mein bisheriger Matlab Code: (Logischerweise funktioniert das mit der Anpassung der Farben und der Legende bisher auch nicht, aber das wäre im nächsten Schritt zu klären.)
% Neues Fenster fuer die Grafik erstellen
figure('Name','Simulation 2','NumberTitle','off');
% Bildnahme (wird spaeter fuer den Export verwendet)
im='A04_Bild_2';
% Matrix mit den einzelnen Variablen, *s.dt ist die Unwandlung in von W zu kWh
mat=[...
Pl*s.dt,... % Last bzw. Haushaltsstrom
PpvDirekt*s.dt,... % PV-Direktnutzung
Pbs2ac*s.dt,... % Batterieentladung
PnetzEnergie,... % Strombezug
];
Unrecognized function or variable 'Pl'.
% Umwandlung Datetime Array zu einem Date Vektor
DateVector=datevec(Date);
% Aufruf der Funktion plotBar
plotBarStackGroups(mat,DateVector);
% Darstellung als Balkendiagramm
% b=bar(Date,mat,'stacked','BarWidth',0.5);
% Anpassung der Balkenfarben mithilfe der RGB-Werte
b(1).FaceColor = [1.0000 0.8000 0]; % gelb
b(2).FaceColor = [0.4660, 0.6740, 0.1880]; % gruen
b(3).FaceColor = [0.75, 0, 0.75]; % rosa
b(4).FaceColor = [0.4940 0.1840 0.5560]; % lila
% Achsen der Darstellung als separate Variable auffuehren
ax=gca;
% Beschriftung der vertikalen Achse
ax.YLabel.String='Energie in kWh';
% Legende ergaenzen
legend([b(1) b(2) b(3) b(4)],...
{...
'Last'
'PV-Direktversorgung',...
'Batterieversorgung',...
'Netzleistung',...
},...
'Location','eastoutside');

4 Comments

Hallo Matthias,
daher habe ich mir das Skrip "plotBarStackGroups.m" geholt und komme da aber nicht weiter.
Wo kommst du denn nicht weiter?
Der Code ist mangels Beispieldaten nicht ausführbar, daher ist es umso schwieriger zu erahnen, wo das Problem liegt.
Hier auch ein Beispiel, wie man so etwas selbst hinbekommen kann:
m = 1:12;
data2 = rand(12, 3);
data1 = sum(data2,2);
b1 = bar(m-0.2, data1, 0.35);
hold on
b2 = bar(m+0.2, data2, 0.35, "stacked");
hold off
xticks(1:12)
Viele Grüße,
Harald
Hallo Harald,
ich danke dir für dein Beispiel, dass hat mir super geholfen!
Jetzt habe ich nur noch ein anderes Problem und zwar ist das die Beschriftung der x-Achsenzeitpunkte.
Folgendes hab ich jetzt geändert:
% Neues Fenster fuer die Grafik erstellen
figure('Name','Simulation 2','NumberTitle','off');
% Bildnahme (wird spaeter fuer den Export verwendet)
im='A04_Bild_2';
% Matrix mit den einzelnen Variablen
mat2=[...
MonatsBetrachtungLast,...
];
% Darstellung als Balkendiagramm
b=bar((mat2{:,1}-0.2),mat2{:,3},0.35);
% Anpassung der Balkenfarben mithilfe der RGB-Werte
b(1).FaceColor = [1.0000 0.8000 0]; % gelb
hold on
b2 = bar((mat2{:,1}+0.2),mat2{:,4:6},0.35,"stacked");
b2(1).FaceColor = [0.4660, 0.6740, 0.1880]; % gruen
b2(2).FaceColor = [0.75, 0, 0.75]; % rosa
b2(3).FaceColor = [0.4940 0.1840 0.5560]; % lila
hold off
% Achsen der Darstellung als separate Variable auffuehren
ax=gca;
% Werte der horizontalen Achse anpassen
ax.XTick=(1:12);
% Neue Bezeichnung der Kategorien einfuegen
ax.XTickLabel=(['Jan';'Feb';'März';'Apr';'Mai';'Jun';'Jul';'Aug';'Sep';'Okt';'Nov';'Dez']);
% Beschriftung der vertikalen Achse
ax.YLabel.String='Energie in kWh';
% Legende ergaenzen
legend([b(1) b2(1) b2(2) b2(3)],...
{...
'Last',...
'PV-Direktversorgung',...
'Batterieversorgung',...
'Netzbezug',...
},...
'Location','eastoutside');
Mein Problem ist jetzt, wenn ich ax.XTickLabel mit dem Vektor aufrufe, bekomme ich eine Fehlermeldung:
"Error using vertcat; Dimensions of arrays being concatenated are not consistent."
Alles andere funktioniert.
Ich möchte halt nur noch die Zahlen 1 -12 durch die abgekürzten Monatsnamen ersetzen...
Bisheriges Ergebnis OHNE den Befehlaufruf "ax.XTickLabel":
Also schon fast fertig ;)
LG
Matthias
Hallo,
du müsstest entweder, ähnlich wie beim legend-Befehl darunter, { } statt [ ] verwenden oder - noch besser " " statt ' '. dann sollte es klappen. Mit " " erstellt man strings statt Arrays von chars. Meist deutlich klarer in der Handhabung.
VG,
Harald
Hallo Harald,
alles klar, es hat geklappt!
Super, danke dir! :)
LG
Matthias

Sign in to comment.

Answers (0)

Products

Release

R2023b

Asked:

on 20 Jan 2024

Commented:

on 25 Jan 2024

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!