Farbfunktion in DensityPlot3D funktioniert nicht wie erwartet

Nov 21 2020

Ich versuche, die Farbfunktion einer DensityPlot3DAusgabe 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*zund 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

2 shanedrum Nov 21 2020 at 18:28

Ah, mir wurde klar, dass die Argumente, die an geliefert ColorFunctionwerden, skalierte Versionen der geplotteten Werte sind. Die Werte, die ich im Diagramm sehe, sind also nicht die genauen Werte, mit denen gearbeitet ColorFunctionwird. 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:

  1. Probleme mit ColorFunction
  2. Stückweise ColorFunction für Plot3D

Ich hoffe, diese Antwort hilft anderen, die ähnliche Probleme haben.