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

Fläche unter mehreren Graphen mit neg. u pos. Werten fülle

 

cordman
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 03.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.02.2013, 18:47     Titel: Fläche unter mehreren Graphen mit neg. u pos. Werten fülle
  Antworten mit Zitat      
Hallo,

ich versuche schon seit Stunden eine Lösung für mein -eigentlich einfaches- Problem zu finden und bin so langsam am verzweifeln..

Ich habe 5 Datenreihen (siehe Anhang), die teils negative, teils positive Werte beinhalten. Diese möchte ich nun so darstellen, dass die Fläche unter der Kurve bis zur X-Achse für jede Datenreihe jeweils farblich ausgefüllt wird, sowohl für postitive, aus auch für negative Werte. Es soll in etwa so aussehen wie die angehängte Darstellung eines Batteriesystems!

Ich habe schon versucht das Ganze mit Area zu lösen aber irgendwie verschwindet immer eine der beide Datenreihen mit den negativen Werten. Wenn ich Bars nehme, habe ich das Problem, dass zwischen den Balken Abstände gesetzt werden..

Kann mir vielleicht jemand weiterhelfen?


Danke u Grüße

untitled.jpg
 Beschreibung:
Datenreihen

Download
 Dateiname:  untitled.jpg
 Dateigröße:  69.28 KB
 Heruntergeladen:  657 mal
Darstellung_Batteriesystem.jpg
 Beschreibung:
Darstellung Batteriesystem

Download
 Dateiname:  Darstellung_Batteriesystem.jpg
 Dateigröße:  50.88 KB
 Heruntergeladen:  690 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.02.2013, 19:43     Titel:
  Antworten mit Zitat      
Hallo,

poste doch bitte den Code, den du bisher versucht hast.
Am besten mit kleinen Beispieldaten.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 03.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.02.2013, 10:54     Titel:
  Antworten mit Zitat      
Sorry, habe aus Versehen in den falschen Thread gepostet weil ich daraus nochmal den Code für die Area genommen habe.. Wink


Auf ein Neues:


Also meine Daten sind in der Matrix "Diagrammdaten" (Typ: 96x5 Double):

Diagrammdaten =

0 1.1870 -1.1870 0 0
0 1.1627 -1.1627 0 0
0 1.1478 -1.1478 0 0
0 1.1365 -1.1365 0 0
0 1.1197 -1.1197 0 0
0 1.1029 -1.1029 0 0
0 1.0861 -1.0861 0 0
0 1.0692 -1.0692 0 0
0 1.0599 -1.0599 0 0
0 1.0524 -1.0524 0 0
0 1.0487 -1.0487 0 0
0 1.0487 -1.0487 0 0
0 1.0505 -1.0505 0 0
0 1.0524 -1.0524 0 0
0 1.0524 -1.0524 0 0
0 1.0487 -1.0487 0 0
0 1.0375 -1.0375 0 0
0 1.0262 -1.0262 0 0
0 1.0206 -1.0206 0 0
0 1.0262 -1.0262 0 0
0 1.0487 -1.0487 0 0
0 1.0954 -1.0954 0 0
0 1.1739 -1.1739 0 0
0 1.2880 -1.2880 0 0
0 1.4487 -1.4487 0 0
0 1.6674 -1.6674 0 0
0 1.9590 -1.9590 0 0
0 2.3366 -2.3366 0 0
0 2.8058 -2.8058 0 0
0 3.3367 -3.3367 0 0
0 3.8919 -3.8919 0 0
0 4.4340 -4.4340 0 0
0 4.9163 -4.9163 0 0
-0.0187 5.2733 -5.2547 0 0
-0.1605 5.4359 -5.2754 0 0
-0.5036 5.3294 -4.8258 0 0
-0.8903 4.9181 -4.0279 0 0
-1.3075 4.3069 -2.9994 0 0
-1.7479 3.6414 -1.8935 0 0
-2.2033 3.0582 -0.8549 0 0
-2.6651 2.6694 -0.0043 0 0
-3.1246 2.4637 0 0.6609 0.6609
-3.5730 2.3964 0 1.1766 1.8374
-4.0016 2.4245 0 1.5771 3.4145
-4.4018 2.5049 0 1.8970 5.3115

....



Aus diesen möchte ich nun eine Area erstellen:

Code:
% Code für's Diagramm:
fig_werte = figure;
h = area(Diagrammdaten);
grid
legend('Erzeugung','Verbrauch','Netzbenutzung','Speicherbenutzung','Fuellstand',-1)
set(fig_werte, 'Name', 'Werte', 'NumberTitle', 'off')
 


Leider wird immer eine Reihe "verschluckt" bzw. nicht angezeigt. Es sollten ja 5 Reihen und auch Farben sein. Die Beschriftung der Daten stimmt wahrscheinlich auch deswegen nicht mit den Datenreihen überein..

Bin für jede Hilfe dankbar!!

Darstellung_Batteriesystem.jpg
 Beschreibung:
So in der Art sollte es später aussehen

Download
 Dateiname:  Darstellung_Batteriesystem.jpg
 Dateigröße:  50.88 KB
 Heruntergeladen:  659 mal
untitled2.jpg
 Beschreibung:
Area mit "verschluckter" Reihe

Download
 Dateiname:  untitled2.jpg
 Dateigröße:  97.01 KB
 Heruntergeladen:  622 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
cordman
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 03.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.02.2013, 15:10     Titel:
  Antworten mit Zitat      
Ich habe jetzt nochmal mein Glück mit einem Bar-Plot versucht, da ein AreaPlot nicht das Mittel der Wahl zu sein scheint.

Leider werden die Balken der Zeitreihen nebeneinander dargestellt. (siehe Anhang)
Gibt es auch eine Möglichkeit die Abstände auf Null zu setzen, so dass eine zusammenhängende Fläche entsteht?
Und kann man dann verschiedene dieser Flächen "übereinander" plotten, so dass z.B. Zeitreihe1 Zeitreihe2 verdeckt?

Dann hätte ich ja die gewünschte Darstellung Wink

Anbei nochmal die Diagrammdaten. Diese habe ich einfach mit Rechtsklick "Bar plot" geplottet und eine Legende eingefügt.

Danke und Grüße

Daten_als_LinePlot.jpg
 Beschreibung:

Download
 Dateiname:  Daten_als_LinePlot.jpg
 Dateigröße:  22.5 KB
 Heruntergeladen:  693 mal
Daten_als_BarPlot.jpg
 Beschreibung:

Download
 Dateiname:  Daten_als_BarPlot.jpg
 Dateigröße:  35.98 KB
 Heruntergeladen:  669 mal
Diagrammdaten.txt
 Beschreibung:

Download
 Dateiname:  Diagrammdaten.txt
 Dateigröße:  4.65 KB
 Heruntergeladen:  356 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
cordman
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 03.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.02.2013, 12:40     Titel:
  Antworten mit Zitat      
Jetzt bin ich doch schon ein wenig weiter gekommen und habe das Problem mit mehreren Bar-Plots lösen können. Sogar das mit der Transparenz hat geklappt!

Hier mal der Code und das Ergebnis im Anhang
Code:

p3 = bar(Diagrammdaten(:,3),'FaceColor', [1 0.5 0.2],'LineStyle','-','BarWidth',0.8);
hold on;
p4 = bar(Diagrammdaten(:,4),'FaceColor',[0 1 0],'LineStyle','-','BarWidth',0.8);
p1 = bar(Diagrammdaten(:,1),'FaceColor',[1 1 0],'LineStyle','-','BarWidth',0.8);
p2 = bar(Diagrammdaten(:,2),'FaceColor', [0 0 1],'LineStyle','-','BarWidth',0.8);
colorBarh=get(p1,'Children');
set(colorBarh,'FaceAlpha',0.7);
colorBarh=get(p2,'Children');
set(colorBarh,'FaceAlpha',0.7);
% p5 = bar(Diagrammdaten(:,5)),'FaceColor',[0 0 1];
 



Nun möchte ich in das Diagramm noch eine zweite Y-Achse mit einem Line-Plot einfügen. Das funktioniert ja grundsätzlich mit "plotyy()".
Leider habe ich dann aber das Problem, dass ich nicht mehr auf die Eigenschaften der einzelnen Bars wie z.B. 'FaceAlpha' oder 'LineStyle' zugreifen kann.

Hier mal ein exemplatischer Code mit Bars und einer Line, der bis auf die Veränderung der Bar-Eigenschaften, funktioniert (Ergebnis im Anhang):

Code:

FontSize = 12;

x = [-10:0.01:10];
y1 = 10*sin(x);
y2= 100*x.*y1;
y3= 50*x.*y1;
y4= 25*x.*y1;

figure2 = figure();
[AX,H1,H2] = plotyy(x,y1',x,[y2' y3' y4'],'plot','bar');

set(get(AX(1),'Ylabel'),'String','Label y1')
set(get(AX(1),'Ylabel'),'FontSize',FontSize)
set(get(AX(2),'Ylabel'),'String','Label y2')
set(get(AX(2),'Ylabel'),'FontSize',FontSize)

xlabel('Label X','FontSize',FontSize)
title('Titel','FontSize',FontSize)

set(H1,'LineWidth',1,'Color',[1 0 0])
set(H2,'FaceColor',[0 1 0],'BarWidth',0.5) % Funktioniert leider nicht!

set(AX(1),'FontSize',FontSize,'YColor',[1 0 0]);
set(AX(2),'FontSize',FontSize,'YColor',[0 0 1]);
 


Weiß jemand wie ich meine 4 Datenreihen als Bar und eine Datenreihe als Line mit zwei verschiedenen Y-Achsen in einem Diagramm darstellen kann UND dabei noch die Eigenschaften der Bars verändern kann!?

Es gibt ja einen Handle aber irgendwie scheinen die Änderungen nicht zu greifen...

Danke und Grüße
Cord

Balkendarstellung_plus_Line_zwei_Y_Achsen.jpg
 Beschreibung:

Download
 Dateiname:  Balkendarstellung_plus_Line_zwei_Y_Achsen.jpg
 Dateigröße:  30.16 KB
 Heruntergeladen:  662 mal
Balkendarstellung_eine_Y_Achse.jpg
 Beschreibung:

Download
 Dateiname:  Balkendarstellung_eine_Y_Achse.jpg
 Dateigröße:  124.64 KB
 Heruntergeladen:  625 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
cordman
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 03.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.02.2013, 16:39     Titel:
  Antworten mit Zitat      
Mit viel googlen und dem Property-Editor bin ich nun fast am Ziel aber verzweilfle jetzt an einem Darstellungsproblem.
Aus irgendwelchen ominösen Gründen sind die Balken leicht versetzt, sodass es irgendwie seltsam aussieht. (siehe Anhang)

Keine Ahnung ob das an Matlab liegt oder an irgendeinder Eigenschaft. Habe schon alles bis auf nötigste reduziert aber keine Änderung zeigte eine Wirkung...

Kann mir da vielleicht jemand helfen? Bin ja jetzt fast am Ziel.. Wink

Hier mal der gesamte Code der Plot-Funktion:

Code:

function createfigure(ymatrix1, X1, Y1)
%CREATEFIGURE(YMATRIX1,X1,Y1)
%  YMATRIX1:  bar matrix data
%  X1:  vector of x data
%  Y1:  vector of y data

%  Auto-generated by MATLAB on 14-Feb-2013 13:51:03

% Create figure
figure1 = figure;

% Create axes
axes1 = axes('Parent',figure1,...
    'YTickLabel',{'-20 kW','-10 kW','0 kW','10 kW','20 kW'},...
    'YTick',[-20 -10 0 10 20],...
    'YColor',[0.0392156862745098 0.141176470588235 0.415686274509804],...
    'XTick',[0 8 16 24 32 40 48 56 64 72 80 88 96],...
    'XTickLabel',[0 2 4 6 8 10 12 14 16 18 20 22 24],...
    'FontName','Calibri');
%% Uncomment the following line to preserve the X-limits of the axes
xlim(axes1,[0 96]);
%% Uncomment the following line to preserve the Y-limits of the axes
ylim(axes1,[-20 20]);
box(axes1,'on');
hold(axes1,'all');

% Speicher Netz Verbrauch Erzeugung
% Create multiple lines using matrix input to bar
bar1 = bar(ymatrix1,'BarWidth',4,'Parent',axes1);
set(bar1(1),...
    'FaceColor',[0.164705882352941 0.384313725490196 0.274509803921569],...
    'DisplayName','Speicher');
set(bar1(2),'FaceColor',[0.87 0.49 0],'DisplayName','Netz');
set(bar1(3),...
    'FaceColor',[0.0392156862745098 0.141176470588235 0.415686274509804],...
    'DisplayName','Stromverbrauch');
set(bar1(4),'FaceColor',[1 1 0],'DisplayName','PV-System');

% Transparenz setzen
colorBarh=get(bar1(3),'Children');
set(colorBarh(1),'FaceAlpha',0.85);
colorBarh=get(bar1(4),'Children');
set(colorBarh(1),'FaceAlpha',0.85);

% Create ylabel
ylabel({'Leistung'},'FontSize',16,'FontName','Calibri',...
    'Color',[0.0392156876623631 0.141176477074623 0.415686279535294]);

% Create axes
axes2 = axes('Parent',figure1,...
    'YTickLabel',{'','','','','0 %','25 %','50 %','75 %','100 %'},...
    'YTick',[0 5 10 15 20 25 30 35 40],...
    'YMinorGrid','on',...
    'YAxisLocation','right',...
    'YColor',[0.164705882352941 0.384313725490196 0.274509803921569],...
    'XTickLabel',['0 ';'2 ';'4 ';'6 ';'8 ';'10';'12';'14';'16';'18';'20';'22';'24'],...
    'XTick',[0 8 16 24 32 40 48 56 64 72 80 88 96],...
    'FontName','Calibri',...
    'Color','none');
%% Uncomment the following line to preserve the X-limits of the axes
xlim(axes2,[0 96]);
%% Uncomment the following line to preserve the Y-limits of the axes
ylim(axes2,[0 40]);
hold(axes2,'all');

% Create plot
plot(X1,Y1,'Parent',axes2,'LineWidth',1.5,...
    'Color',[0.164705887436867 0.384313732385635 0.274509817361832]);

% Create xlabel
xlabel('Uhrzeit','FontSize',16,'FontName','Calibri');

% Create ylabel
ylabel({'Ladezustand des Speichers'},'VerticalAlignment','cap',...
    'FontSize',14,...
    'FontName','Calibri',...
    'Color',[0.164705882352941 0.384313725490196 0.274509803921569]);

% Create legend
legend1 = legend(axes1,'show');
set(legend1,...
    'EdgeColor',[0.800000011920929 0.800000011920929 0.800000011920929],...
    'YColor',[0.800000011920929 0.800000011920929 0.800000011920929],...
    'XColor',[0.800000011920929 0.800000011920929 0.800000011920929],...
    'Position',[0.764583333333333 0.174499568282849 0.100260416666666 0.125963901689708]);

% Create textbox
annotation(figure1,'textbox',...
    [0.165583333333333 0.757596618123291 0.119833333333333 0.064690026954179],...
    'String',{'Nutzung'},...
    'FontSize',24,...
    'FontName','Calibri',...
    'FitBoxToText','off',...
    'LineStyle','none',...
    'Color',[0.501960813999176 0.501960813999176 0.501960813999176]);

% Create textbox
annotation(figure1,'textbox',...
    [0.161104166666667 0.199540809400998 0.119833333333333 0.064690026954179],...
    'String',{'Versorgung'},...
    'FontSize',24,...
    'FontName','Calibri',...
    'FitBoxToText','off',...
    'LineStyle','none',...
    'Color',[0.501960813999176 0.501960813999176 0.501960813999176]);

 


Aufgerufen wird diese im "Hauptprogramm" so:

Code:

Diagramm_Verlauf_Ein_und_Ausspeicherung_Plot(A,x,B)
 


wobei A die Reihen für die Bars enthält, x die X-Werte und B die Werte des Line-Plots.

Ich verzweifle echt bald... Weiß jemand da weiter?

Danke und Gruß
Cord

Darstellung_Batteriesystem_Versatz.jpg
 Beschreibung:

Download
 Dateiname:  Darstellung_Batteriesystem_Versatz.jpg
 Dateigröße:  176.16 KB
 Heruntergeladen:  627 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
cordman
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 03.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.02.2013, 15:07     Titel:
  Antworten mit Zitat      
Hat denn wirklich niemand ein Idee?? Der "offset" muss ja irgendwie durch die zweite Y-Achse verursacht werden. Ich hab nur leider keine Idee mehr..
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

versuch mal, in den bar-Befehl noch 'stacked' reinzubringen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 03.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.02.2013, 15:56     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine Antwort. Meinst du eine Darstellung als "stacked" bar?

Wenn ich die Reihen stapel verschiebt sich doch die ganze Darstellung, oder? Ich möchte die Balken ja gerne voreinander haben..

Grüße,
Cord
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: 21.02.2013, 18:59     Titel:
  Antworten mit Zitat      
Hallo cordman,

Ich finde die Balken-Graphen häßlich. Der gepostete Code und die Problembeschreibungen sind sehr umfangreich und ich finde den eigentlichen Knackpunkt nicht, was aber auch an meinem Fieber liegen mag. Die Angaben der Farben mit so vielen Nachkommastellen macht mich ganz schockelig, da in der Darstellung dann doch nur 8 Bit pro Kanal zur Verfügung stehen. Dies wäre hübscher statt "[0.164705882352941 0.384313725490196 0.274509803921569]", aber genauso akkurat:
Code:
[42, 98, 70] / 255



Vielleicht hilft dies:
Code:
x = linspace(0,2*pi, 100);
y1 = sin(x);
y2 = cos(x);
patch('XData', [x(1), x, x(end), x(1)], 'YData', [0, y1, 0, 0], ...
         'FaceColor', [0.8,0.8,0], 'EdgeColor', 'none', 'FaceAlpha', 0.3);
patch('XData', [x(1), x, x(end), x(1)], 'YData', [0, y2, 0, 0], ...
         'FaceColor', [0.8,0,0.8], 'EdgeColor', 'none', 'FaceAlpha', 0.3);
 

Statt eine teilweise Transparenz zu setzen, kann man die Flächen auch opaque zeichnet und nochmal die Umrisse mit gesetzter EdgeColor und ohne FaceColor nachzeichnen:
Code:
figure;
patch('XData', [x(1), x, x(end), x(1)], 'YData', [0, y1, 0, 0], ...
         'FaceColor', [0.8,0.8,0], 'EdgeColor', 'none');
patch('XData', [x(1), x, x(end), x(1)], 'YData', [0, y2, 0, 0], ...
         'FaceColor', [0.8,0,0.8], 'EdgeColor', 'none');
patch('XData', [x(1), x, x(end), x(1)], 'YData', [0, y1, 0, 0], ...
         'EdgeColor', [0.8,0.8,0], 'FaceColor', 'none');
patch('XData', [x(1), x, x(end), x(1)], 'YData', [0, y2, 0, 0], ...
         'EdgeColor', [0.8,0,0.8], 'FaceColor', 'none');

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
cordman
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 03.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.02.2013, 20:57     Titel:
  Antworten mit Zitat      
Moin Jan,

danke für die Antwort. Irgendwie bist du ja scheinbar in jedem meiner angelegten Threads aktiv Wink

Also die Balkendarstellung habe ich gewählt weil ich nur Daten in Viertelstundenauflösung habe und keine stetige Funktion. Da sehen bei 24*4 Werten meiner Meinung nach Balken besser aus. Dabei sind die Farben völlig nebensächlich, da ich die eh später nochmal uniform mit einer colormap für alle Grafiken in meiner Arbeit ändere.

Mir geht es nur um den Versatz der Balken, der offensichtlich durch Einführung der zweiten Y-Achse verursacht wird. Vorher sah es ja wie im Anhang des Threads davor gepostet "normal" aus. Das kann doch nicht so schwer sein, oder!?

Grüße
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.