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

3D Plot einfärben

 

Joey_55

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.12.2013, 17:14     Titel: 3D Plot einfärben
  Antworten mit Zitat      
Huhu liebe Community,

ich plotte seit kurzem einige Dinge in 3D, aber verzweifle langsam an der Art und Weise die geplotteten Flächen zu füllen. Ich hoffe ihr könnt mir weiterhelfen! Mein 3 D Plot Script sieht folgendermaßen aus!

Code:


figure (4)
plot3(EEX_Day_Ahead_Test(:,2),EEX_Day_Ahead_Test(:,1),EEX_Day_Ahead_Test(:,3),'bx');
% fill3(EEX_Day_Ahead_Test(:,2),EEX_Day_Ahead_Test(:,1),EEX_Day_Ahead_Test(:,3),'C')
%  patch('XData', EEX_Day_Ahead_Test(:,2), ...
%        'YData', EEX_Day_Ahead_Test(:,1), ...
%        'ZData', EEX_Day_Ahead_Test(:,3), ...
%        'FaceColor', [1, 0, 0], ...
%        'FaceAlpha', 0.5);
xlabel('Uhrzeit (h)')
ylabel('Tag des Jahres')
zlabel('Spot Preis €/MWh ')
grid on;

 


In einer Variable sind drei für mich relevante Spalten die ich in 3D plotten möchte. Wenn ich Sie plotte und mit fill3 einfärbe, färbt er mir die Flächen unter den Plots. Bei patch sieht es ähnlich obskur aus. Ich bekomme bei fill3 folgende Grafik (1) und möchte gerne einen Plot in solcher Einfärbung Grafik (2). Bedeutet ich möchte nicht die FLäche unter, sondern zwischen den Werte auf der x und y Achse. Es soll eine Art Welle entstehen. Ist das möglich?

Über jeden Tipp wäre ich sehr dankbar!

Grafik 1 - Kopie.jpg
 Beschreibung:
Grafik 2

Download
 Dateiname:  Grafik 1 - Kopie.jpg
 Dateigröße:  354 KB
 Heruntergeladen:  651 mal
Grafik 1.jpg
 Beschreibung:
Grafik 1

Download
 Dateiname:  Grafik 1.jpg
 Dateigröße:  204.55 KB
 Heruntergeladen:  502 mal


Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 04.12.2013, 17:22     Titel:
  Antworten mit Zitat      
Hallo,

vermutlich musst du erst auf ein gemeinsames Gitter interpolieren. Dazu kann dir die Funktion griddata() helfen und dann ein Plot mit surf().

Viele Grüße,
Nras.

Edit: Das sieht ja so aus, als hättest du bereits Daten auf einem regelmäßigen Gitter, nur sind die noch nicht so angeordnet. Vermutlich steht in der ersten Spalte nun 24(?) mal der gleiche Wert für den Tag und deine zweite Spalte wiederholt ständig dieselben Uhrzeiten?

Entweder hilft da ein unique() und ein anschließendes meshgrid() oder vielleicht kriegt man da auch mit reshape() direkt was hin. Aber ohne die Daten zu sehen kann man nur raten.

Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
Joey_55

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2013, 15:18     Titel:
  Antworten mit Zitat      
Hallo Nras,

leider bekomme ich das mit den Daten noch nicht so gut hin, weswegen ich einfach mal die Tage gelasse habe, wie sie waren.
Je Tag(Y-Achse) gibt es 24 Werte die ich auf der X_Achse darstelle und diese sollen über die Tage (Siehe Grafik 1 Kopie) eingefärbt werden.
Ich weiß leider überhaupt nicht mehr weiter...

Ich habe dir mal die Dateien rangehangen. Die dritte Spalte der Variable entspricht dem EEX-Preis. Hoffentlich kannst du mir helfen!

Grüße
Joey

EEX_2012_DayAhead_Test.zip
 Beschreibung:

Download
 Dateiname:  EEX_2012_DayAhead_Test.zip
 Dateigröße:  1.76 KB
 Heruntergeladen:  277 mal
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 06.12.2013, 15:29     Titel:
  Antworten mit Zitat      
Hallo,

ich hab die Datei aus dem Zip file un die letzten 3 Zeilen erweitert:
Code:
clc;
clear all;

load EEX_2012_DayAhead_Test;

figure (1)
plot3(EEX_Day_Ahead_Test(:,2),EEX_Day_Ahead_Test(:,1),EEX_Day_Ahead_Test(:,3),'ok');
% fill3(EEX_Day_Ahead_Test(:,2),EEX_Day_Ahead_Test(:,1),EEX_Day_Ahead_Test(:,3),'C')
%  patch('XData', EEX_Day_Ahead_Test(:,2), ...
%        'YData', EEX_Day_Ahead_Test(:,1), ...
%        'ZData', EEX_Day_Ahead_Test(:,3), ...
%        'FaceColor', [1, 0, 0], ...
%        'FaceAlpha', 0.5);
xlabel('Uhrzeit (h)')
ylabel('Tag des Jahres')
zlabel('Spot Preis �/MWh ')
grid on;

% Als Fläche:
[X,Y] = meshgrid(1:24,unique(EEX_Day_Ahead_Test(:,1)));
hold on,
surf(X,Y,(reshape(EEX_Day_Ahead_Test(:,3),24,12))')
 

Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
Joey_55

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.12.2013, 10:20     Titel:
  Antworten mit Zitat      
Hallo Nras,

ich danke dir nochmals recht herzlich für deine Hilfe.
Genauso soll es aussehen.

Nachdem ich(du) das jetzt geplottet habe, wollte ich statt der Tageszahl noch ein Datum einpflegen. Dazu musste ich natürlich den Variablenumfang von EEX_... erweitern. Es sieht jetzt wie folgt aus:

Code:

clc;
clear all;

load EEX_2012_DayAhead_Test;

%% Datum 1 Monat
Anfangswert=734869+0/24;
Endwert=734899+23/24;
Schrittweite=1/24;


Vektor=Anfangswert:Schrittweite:Endwert;
DatumStr=datestr(Vektor, 'dd.mm.yyyy');
DatumCell=cellstr(DatumStr);

%% 3 D Plot
figure (1)
plot3(EEX_Day_Ahead_Test(:,2),EEX_Day_Ahead_Test(:,1),EEX_Day_Ahead_Test(:,3),'ok');
% fill3(EEX_Day_Ahead_Test(:,2),EEX_Day_Ahead_Test(:,1),EEX_Day_Ahead_Test(:,3),'C')
%  patch('XData', EEX_Day_Ahead_Test(:,2), ...
%        'YData', EEX_Day_Ahead_Test(:,1), ...
%        'ZData', EEX_Day_Ahead_Test(:,3), ...
%        'FaceColor', [1, 0, 0], ...
%        'FaceAlpha', 0.5);
xlabel('Uhrzeit (h)')
ylabel('Tag des Jahres')
zlabel('Spot Preis €/MWh ')
grid on;

% Als Fläche:
[X,Y] = meshgrid(1:24,unique(DatumCell(:,1)));
hold on,
surf(X,Y,(reshape(EEX_Day_Ahead_Test_Monat(:,3),24,12))')
 


Jetzt gibt er folgenden Fehler aus:

Code:

Undefined function 'full' for input arguments of type 'cell'.

Error in meshgrid (line 57)
        ycol = full(y(:));   % Make sure y is a full column vector.

Error in Test_3D (line 31)
[X,Y] = meshgrid(1:24,unique(DatumCell(:,1)));
 


Muss ich das Datum erst wieder umwandeln? Embarassed

Grüße
Joey
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 07.12.2013, 12:12     Titel:
  Antworten mit Zitat      
Hallo,

ich bin mir gar nicht sicher, ob meshgrid mit Strings umgehen kann, bzw. was dann passiert. Vor allem mit der Kombination aus unique. Aber du kannst dir das manuelle Umwandeln komplett sparen. Matlab kann mit den datenums ziemlich gut umgehen.

Dir hilft ein einfaches
Code:
datenum('y','yyyy-mm-dd')

nach dem surf()-kram, um den Tag im Jahr in das gewünschte Format umzuwandeln (hier: yyyy-mm-dd). Siehe einfach doc datenum für mehr Details.

Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
Joey_55

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.12.2013, 15:16     Titel:
  Antworten mit Zitat      
Ich habe es jetzt noch nicht ausprobiert, weil ich noch unterwegs bin, aber das y bei datenum...

Code:

clc;
clear all;

load EEX_2012_DayAhead_Test;


figure (1)
plot3(EEX_Day_Ahead_Test(:,2),EEX_Day_Ahead_Test(:,1),EEX_Day_Ahead_Test(:,3),'ok');
xlabel('Uhrzeit (h)')
ylabel('Tag des Jahres')
zlabel('Spot Preis €/MWh ')
grid on;

% Als Fläche:
[X,Y] = meshgrid(1:24,unique(EEX_Day_Ahead_Test(:,1)));
hold on
surf(X,Y,(reshape(EEX_Day_Ahead_Test(:,3),24,12))')
datenum('y','yyyy-mm-dd')
 


... wäre dann was? In 'Y' gibt es die Werte, aber das wird er doch nicht nehmen?
Ich stehe gerade auf dem Schlauch...

Ich danke Dir
Nras!
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 07.12.2013, 15:21     Titel:
  Antworten mit Zitat      
Halllo,

ich hab da den falschen Befehl getippt, als ich meckern wollte, dass ein
Code:
dir weitergeholfen hätte.
in deinem Plot gibt es 3 Achsen, die x-, die y- und die z-Achse. Auf der y-Achse steht die Zeit in Tagen, auf der x-Achse die Uhrzeit und auf der z-Achse die entsprechenden Werte.
Das 'y' steht dann dafür, dass der y-Achse dieses Format gegeben wird.

Der korrekte Befehl lautet dann also
Code:
datetick('y','yyyy-mm-dd')


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