La fonction de couleur dans DensityPlot3D n'agit pas comme prévu

Nov 21 2020

Im essayant de définir la fonction de couleur d'une DensityPlot3Dsortie afin qu'elle colore les valeurs positives d'une couleur et colore les valeurs négatives d'une couleur différente. Cependant, je n'arrive pas à le faire fonctionner correctement. Par exemple, le code pertinent est:

\[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]]
]

Ici, la fonction de couleur que je lui dis d'utiliser est

Function[f, Which[Sign[f] == 1, Black, Sign[f] == -1, Blue, Sign[f] == 0, Gray]]

Prenez donc les valeurs positives du produit x*y*zet colorez-les en noir, prenez les valeurs négatives et colorez-les en bleu, et prenez tout le reste en gris.

Ce code, lorsqu'il est exécuté par lui-même, produit

ce qui n'est pas ce que je veux :(. Est-ce que je comprends mal les arguments de la fonction de couleur? J'ai lu le document et je pense que je l'utilise correctement, mais je suppose que non. J'ai aussi essayé la fonction

(Which[Sign[#] == -1, Blue, Sign[#] == 0, Gray, Sign[#] == 1, 
   Black] &)

avec le même résultat. J'ai également un problème avec le OpacityFunction, comme vous pourrez peut-être le dire dans l'exemple d'image ci-dessus. La fonction OpacityFunction dans l'exemple de code devrait produire une image qui est fondamentalement transparente au centre même et solide sur les faces du cube (nous devrions donc juste voir un cube noir), mais l'image montre que les coins du cube sont définis sur 0 opacité. Par exemple, le point (-2, -2, -2) doit avoir une opacité|Tanh[-8]|~1

Im utilisant juste un exemple de fonction ci-dessus, la fonction réelle est beaucoup plus compliquée. Je vais attacher la sortie de la fonction réelle que je dois colorier ci-dessous:

Im utilisant une fonction d'opacité pour jeter toutes les valeurs vraiment proches de zéro, laissant derrière les bits intéressants.

J'apprécie toute perspicacité!

Réponses

2 shanedrum Nov 21 2020 at 18:28

Ah, je me suis rendu compte que c'était parce que les arguments fournis au ColorFunctionsont des versions mises à l' échelle des valeurs tracées. Les valeurs que je vois dans le graphique ne sont donc pas les valeurs exactes sur lesquelles ColorFunctionfonctionne. Pour arrêter la mise à l'échelle, j'ai simplement défini

ColorFunctionScaling-> False

OpacityFunctionScaling -> False

et cela a résolu le problème.

Alors maintenant, le code suivant

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
]

produit l'image

ce qui se traduit par la fonction réelle que je souhaite utiliser parfaitement. Vous pouvez voir, les zones avec des valeurs positives de x y z sont colorées en vert et les zones avec des valeurs négatives de x y z sont colorées en bleu. De plus, l'opacité se comporte également comme vous le souhaitez.

Ces liens m'ont aidé à résoudre mon problème:

  1. Problèmes avec ColorFunction
  2. Piecewise ColorFunction pour Plot3D

J'espère que cette réponse aidera les autres qui rencontrent des problèmes similaires.