DensityPlot3Dの色関数が期待どおりに機能しない

Nov 21 2020

DensityPlot3D出力の色関数を設定して、正の値を1つの色に着色し、負の値を別の色に着色しようとしています。しかし、私はそれを正しく動作させることができないようです。たとえば、関連するコードは次のとおりです。

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

ここで、私が使用するように指示している色関数は

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

したがって、製品の正の値をx*y*z取得して黒に色付けし、負の値を取得して青に色付けし、その他すべてを灰色にします。

このコードを単独で実行すると、次のようになります。

これは私が望んでいることではありません:(。色関数の引数を誤解していますか?ドキュメントを読んで、正しく使用していると思いますが、そうではないと思います。関数も試しました。

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

同じ結果になります。OpacityFunction上の画像の例でわかるように、Imにも問題があります。サンプルコードのOpacityFunctionは、基本的に中心が透明で、立方体の面が塗りつぶされている画像を生成する必要があります(したがって、黒い立方体が表示されるはずです)が、画像は、立方体の角が次のように設定されていることを示しています。 0不透明度。たとえば、ポイント(-2、-2、-2)は不透明である必要があります|Tanh[-8]|~1

上記の関数の例を使用しているだけですが、実際の関数ははるかに複雑です。以下に色付けする必要のある実際の関数の出力を添付します。

不透明度関数を使用して、実際にゼロに近い値を破棄し、興味深いビットを残します。

私はどんな洞察にも感謝します!

回答

2 shanedrum Nov 21 2020 at 18:28

ああ、私は引数を供給するので、それが実現ColorFunctionされているスケーリングプロットされた値のバージョン。したがって、プロットに表示されている値は、ColorFunctionが操作している正確な値ではありません。スケーリングを停止するには、単に設定します

ColorFunctionScaling-> False

OpacityFunctionScaling -> False

そしてそれは問題を修正しました。

だから今、次のコード

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
]

画像を生成します

これは、私が完全に使用したい実際の関数に変換されます。ご覧のとおり、x y zの値が正の領域は緑色で、x yzの値が負の領域は青色で表示されます。さらに、不透明度も希望どおりに動作します。

これらのリンクは、私の問題を解決するのに役立ちました。

  1. ColorFunctionの問題
  2. Plot3Dの区分的ColorFunction

この回答が、同様の問題を抱えている他の人に役立つことを願っています。