www.vorhilfe.de
- Förderverein -
Der Förderverein.

Gemeinnütziger Verein zur Finanzierung des Projekts Vorhilfe.de.
Hallo Gast!einloggen | registrieren ]
Startseite · Mitglieder · Impressum
Forenbaum
^ Forenbaum
Status VH e.V.
  Status Vereinsforum

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Suchen
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "Mathematica" - Darstellung import. Arrays
Darstellung import. Arrays < Mathematica < Mathe-Software < Mathe < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "Mathematica"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

Darstellung import. Arrays: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 11:07 So 06.06.2010
Autor: melvinj

Hallo,

ich muss zwei importierte Arrays in einem 3D Plot Diagramm darstellen. Hierbei soll das erste Array die normale 3D Oberfläche darstellen und zweite Matrix als Farbimage aufgelegt sein. Beide Arrays haben dieselben Dimensionen (z.B. 128x128 Bildpunkte), enthalten Fließkommazahlen und wurden mit einem Rasterkraftmikroskop aufgenommen. Die erste Matrix enthält die Höheninformationen der untersuchten Probe. Die zweite Matrix andere phys. Eigenschaften.
Mein eigentliches Problem liegt lediglich darin, die zweite Matrix farbcodiert auf die Oberflächenkonturen der ersten aufzulegen. Leider konnte ich diese Aufgabe noch nicht realisieren. Auch der "Colofunction" Befehl der Plot3D Funktion scheint da nicht weiter zu helfen.

Vielen Dank für Eure Hilfe

Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.

        
Bezug
Darstellung import. Arrays: Antwort
Status: (Antwort) fertig Status 
Datum: 10:20 Mo 07.06.2010
Autor: halirutan

Moin,

doch, die ColorFunction Option hilft dir weiter. Nehmen wir doch mal ein Beispiel und erzeugen uns eine Matrix mit Hoehenwerten und eine fuer die Farbgebung. In diesem Fall soll die Farbe die Richtung des Gradienten codieren:

1: f = Cos[x^2 + y^2] + 0.2 Sin[3 x];
2: {dfdx, dfdy} = D[f, #] & /@ {x, y};
3: {heights, col} = 
4:   Transpose[
5:    Table[{f, ArcTan[dfdx, dfdy]}, {y, -1, 1, 2/127.}, {x, -1, 1, 
6:      2/127.}], {3, 2, 1}];
7: {ListPlot3D[heights], ArrayPlot[col, ColorFunction -> Hue]}


[Dateianhang nicht öffentlich]

[Dateianhang nicht öffentlich]

Nun macht man Folgendes: zuerst interpoliert man die Matrix der Farbwerte, damit man die Werte an beliebigen (nicht notwendigerweise ganzahligen) Positionen abrufen kann. Dann musst du dir ueberlegen, wie du aus diesem einen Farbwert auch wirklich eine Farbe bekommst. Dazu koenntest du die "Gradients" der ColorData Funktion nehmen. Ich benutze hier mal nur den Farbwinkel des Hue-Farbraumes.

1:
2: colf = ListInterpolation[col];
3: ListPlot3D[heights, 
4:  ColorFunction -> Function[{x, y, z}, Hue[(colf[y, x] + Pi)/(2 Pi)]], 
5:  ColorFunctionScaling -> False]


[Dateianhang nicht öffentlich]

Aequivalentes Vorgehen sollten jetzt mit deinen Werten moeglich sein. Vielleicht noch 2 Tips, um allzu grosse Frustration zu verhindern:

- der Winkel des Gradienten ist durch den ArcTan immer im Intervall [-Pi,Pi] und muss zuerst auf das Intervall [0,1] gebracht werden, um ihn mit Hue zu benutzen. Bei den ColorData Gradienten ist das noch wichtiger; die wuerden den Wertebereich ausserhalb einfach abschneiden und du erhaelst unerwartete Ergebnisse.
- ColorFunction benutzt immer skalierte [0,1] Werte. Das ist, gerade wenns um die x und y Werte geht nicht immer gewuenscht und muss deshalb mit ColorFunctionScaling->False abgeschaltet werden.

Cheers
Patrick

Dateianhänge:
Anhang Nr. 1 (Typ: png) [nicht öffentlich]
Anhang Nr. 2 (Typ: png) [nicht öffentlich]
Anhang Nr. 3 (Typ: png) [nicht öffentlich]
Bezug
                
Bezug
Darstellung import. Arrays: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 11:19 Mo 07.06.2010
Autor: melvinj

Vielen Dank für Deine Hilfe.

Ich glaube, so wird es funktionieren :-)

lg
melvinj

Bezug
                        
Bezug
Darstellung import. Arrays: Probleme bei Umsetzung
Status: (Frage) beantwortet Status 
Datum: 20:01 Mo 07.06.2010
Autor: melvinj

Hallo nochmal,

prinzipiell verstehe ich den Ansatz Deiner Hilfe. Mein Problem liegt jedoch darin, dass ich wohl zu dumm bin Deine Hilfe umzusetzen :-/

Wie bereits erwähnt, importiere ich quadratische Matratizen aus *.xls Files in Mathematica ein. Das erste Problem betrifft bereits die Darstellung der importierten Matrix mittels "ArrayPlot". Das macht die Funktion schlicht und einfach nicht. Es wird lediglich eine rote Linie geplottet?! Verwende ich die Funktion "ListDensityPlot", dann wird die Matrix korrekt dargestellt.

Das zweite Problem bezieht sich auf den Befehl "ListInterpolate[...]". Hier kommt stets die Fehlermeldung "Requested order is too high; order has been reduced to {0,3,3}." Ich schätze das hängt irgendwie mit der Dimension der Matrix zusammen. Versucht man die "InterpolationOrder" zu reduzieren, meldet Mathematica trotzdem Fehler, sofern man sie nicht manuell gleich 0 setzt.

Wenn ich anschließend versuche diese Matrix als ColorPlot in die ListPlot3D einzubinden (also so wie in Deinem Beispiel), dann hängt sich Mathematica auf. Vielleicht ist das eine Folge der misslungenen Interpolation. Vielleicht müsste ich die importierte Matrix zunächst irgendwie redimensionieren um die Fehlermeldungen zu vermeiden?

Nach dem importieren renormiere ich zunächst die Daten der Matrix so, dass nur noch Werte zwischen 0 und 1 vorkommen, sodass die Matrix kompatibel mit der Hue Operation sein müsste.

Vielleicht könntest Du mal selbst probieren zwei 128x128 Excel Tabellen mittels:

ColorMatrix = ToFileName["DateiPfad", "Matrix1.xls"];
HeightMatrix = ToFileName["DateiPfad", "Matrix2.xls"];

ColorArray = Import[ColorMatrix];
HeightArray = Import[HeightMatrixMatrix];

zu importieren um dann die Colormatrix im ListPlot3D als Colorsurface auf die Heightmatrix zu legen? Vielleicht finde ich auch selbst noch den Fehler.

Vielen Dank für Deine Hilfe.

lg
melvinj

Bezug
                                
Bezug
Darstellung import. Arrays: Antwort
Status: (Antwort) fertig Status 
Datum: 11:00 Di 08.06.2010
Autor: halirutan

Moin,

wenn du

Dimensions[ColorMatrix]
And @@ (NumericQ /@ Flatten[ColorMatrix])

machst, muesste

{128, 128}
True

rauskommen. Das muesste auch bei der HeightMatrix das Ergebnis sein.
Macht es das?

Cheers
Patrick

Bezug
                                        
Bezug
Darstellung import. Arrays: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 15:10 Di 08.06.2010
Autor: melvinj

Hallo,

danke für Deine Antwort.
Als OutPut kommt heraus:  "{True, 128True,128True}"

Die Darstellung der beiden Matrizen, entsprechend Deiner Hilfe, habe ich jetzt trotzdem hinbekommen.
Das Problem liegt darin, dass die importierten Matrizen eine äußere geschweifte Klammer zuviel aufweisen, also: {{{...},{...},...}}. Die äußersten Klammern sind überflüssig und hatten die Probleme verursacht. Wenn ich diese entferne funktioniert sowohl ArrayPlot als auch Interpolation und das Colormap Overlay im ListPlot3D.

Jetzt müsste ich nur wissen, wie man diese Klammern automatisiert gleich nach dem Import herausfiltern kann, damit eine manuelle Korrektur nicht notwendig ist. Da die Matrizen später noch größer werden und die Datenmaps schnell verarbeitet werden sollen, wäre die manuelle Korrektur etwas hinderlich.
Vielleicht sollte man aber schon beim Import selbst ansetzen. Ich könnte die Matrizen auch aus *.txt Files einlesen oder statt Matrizen nur eine fortlaufende Liste importieren, die dann in Mathematica automatisiert zur Matrix formatiert wird?! Geht das, oder hättest Du eine bessere Idee?

Danke für Deine Hilfe. Wenn dieses letzte Problem gelöst ist, das wäre ich dann vollends zufrieden :-)

Viele Grüße



Bezug
                                                
Bezug
Darstellung import. Arrays: Antwort
Status: (Antwort) fertig Status 
Datum: 17:38 Di 08.06.2010
Autor: halirutan

Moin,

wenn dem so ist, wie du sagst, dann sollte

data=First@Import[....]

funktionieren.

Cheers
Patrick

Bezug
                                                        
Bezug
Darstellung import. Arrays: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 18:11 Di 08.06.2010
Autor: melvinj

Jo,

genauso so ist es :-)

Vielen Dank nochmal für Deine Unterstützung

Viele Grüße

Bezug
Ansicht: [ geschachtelt ] | ^ Forum "Mathematica"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
ev.vorhilfe.de
[ Startseite | Mitglieder | Impressum ]