Darstellung import. Arrays < Mathematica < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | 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.
|
|
|
|
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]
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:19 Mo 07.06.2010 | Autor: | melvinj |
Vielen Dank für Deine Hilfe.
Ich glaube, so wird es funktionieren
lg
melvinj
|
|
|
|
|
Status: |
(Frage) beantwortet | 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
|
|
|
|
|
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
|
|
|
|
|
Status: |
(Frage) beantwortet | 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
|
|
|
|
|
Moin,
wenn dem so ist, wie du sagst, dann sollte
data=First@Import[....]
funktionieren.
Cheers
Patrick
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | 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
|
|
|
|