Farbfunktion in DensityPlot3D funktioniert nicht wie erwartet
Ich versuche, die Farbfunktion einer DensityPlot3D
Ausgabe so einzustellen , dass sie die positiven Werte um eine Farbe und die negativen Werte um eine andere Farbe färbt. Ich kann es jedoch nicht richtig zum Laufen bringen. Der relevante Code lautet beispielsweise:
\[CapitalOmega] =
Parallelepiped[{-3, -3, -4}, {{6, 0, 0}, {0, 6, 0}, {0, 0, 8}}];
DensityPlot3D[x*y*z,
{x, y, z} \[Element] \[CapitalOmega],
PerformanceGoal -> "Quality",
PlotRange -> All,
OpacityFunction -> Function[f, If[Abs[f] > 0.4, Abs@Tanh[f], 0]],
PlotLegends -> Automatic,
ImageSize -> Medium,
AxesLabel -> Automatic,
ColorFunction -> Function[f, Which[Sign[f] == 1, Black, Sign[f] == -1, Blue, Sign[f] == 0, Gray]]
]
Hier ist die Farbfunktion, die ich verwenden soll
Function[f, Which[Sign[f] == 1, Black, Sign[f] == -1, Blue, Sign[f] == 0, Gray]]
Nehmen Sie also die positiven Werte des Produkts x*y*z
und färben Sie sie schwarz, nehmen Sie die negativen Werte und färben Sie sie blau und bringen Sie alles andere auf grau.
Dieser Code erzeugt, wenn er von selbst ausgeführt wird


Was ich nicht will :(. Verstehe ich die Argumente der Farbfunktion falsch? Ich habe die Dokumente gelesen und denke, ich verwende sie richtig, aber ich denke nicht. Ich habe auch die Funktion ausprobiert
(Which[Sign[#] == -1, Blue, Sign[#] == 0, Gray, Sign[#] == 1,
Black] &)
mit dem gleichen Ergebnis. Ich habe auch ein Problem mit dem OpacityFunction
, wie Sie im obigen Beispielbild sehen können. Die OpacityFunction im Beispielcode sollte ein Bild erzeugen, das im Grunde genommen in der Mitte transparent und an den Flächen des Würfels durchgehend ist (wir sollten also nur einen schwarzen Würfel sehen), aber das Bild zeigt, dass die Ecken des Würfels eingestellt sind 0 Deckkraft. Beispielsweise sollte der Punkt (-2, -2, -2) eine Deckkraft haben|Tanh[-8]|~1
Ich benutze nur eine Beispielfunktion oben, die eigentliche Funktion ist viel komplizierter. Ich werde die Ausgabe der tatsächlichen Funktion anhängen, die ich unten färben muss:


Ich benutze eine Opazitätsfunktion, um alle Werte, die wirklich nahe bei Null liegen, wegzuwerfen und die interessanten Bits zurückzulassen.
Ich freue mich über jeden Einblick!
Antworten
Ah, mir wurde klar, dass die Argumente, die an geliefert ColorFunction
werden, skalierte Versionen der geplotteten Werte sind. Die Werte, die ich im Diagramm sehe, sind also nicht die genauen Werte, mit denen gearbeitet ColorFunction
wird. Um die Skalierung zu stoppen, setze ich einfach
ColorFunctionScaling-> False
OpacityFunctionScaling -> False
und das hat das Problem behoben.
Also jetzt der folgende Code
DensityPlot3D[x*y*z, {x, y, z} \[Element] \[CapitalOmega],
PerformanceGoal -> "Quality",
PlotRange -> All,
OpacityFunction -> Function[f, If[Abs[f] > 0.5, N[ Abs[Tanh[f]]], 0]],
PlotLegends -> Automatic,
ImageSize -> Medium,
AxesLabel -> Automatic,
ColorFunction -> Function[{f}, If[f > 0, Green, Blue]],
ColorFunctionScaling -> False,
OpacityFunctionScaling -> False
]
erzeugt das Bild


was sich auf die eigentliche Funktion überträgt, die ich perfekt nutzen möchte. Sie können sehen, dass die Bereiche mit positiven Werten von x y z grün und die Bereiche mit negativen Werten von x y z blau gefärbt sind. Außerdem verhält sich die Deckkraft wie gewünscht.
Diese Links haben mir geholfen, mein Problem zu lösen:
- Probleme mit ColorFunction
- Stückweise ColorFunction für Plot3D
Ich hoffe, diese Antwort hilft anderen, die ähnliche Probleme haben.