Plotlegendの問題
Dec 04 2020
関数En1の3Dプロットを作成しており、その色を以下のsz1関数に帰属させています。この関数には-1から1までの値が含まれています。
En1[δ_, g1_, g2_, k_] := 1/2(-I g1 + I g2 -Sqrt[-(g1 + g2 - 2 k + I δ) (g1 + g2 + 2 k + Iδ)] + δ)
vec1[δ_, g1_, g2_,k_] := {{-((I g1 + I g2 + Sqrt[-(g1 + g2 - 2 k + I δ) (g1 + g2 + 2 k + I δ)] - δ)/1), 2 k}}
vec1d[δ_, g1_, g2_,k_] := {{(I g1 + I g2 - Sqrt[-(g1 + g2 - 2 k - I δ) (g1 + g2 + 2 k - I δ)] + δ)/1, 2 k}}
σz = PauliMatrix[3];
σ0 = IdentityMatrix[2];
sz1[δ_, g1_, g2_, k_] := Flatten[vec1d[δ, g1, g2, k]. σz . Transpose[vec1[δ, g1, g2, k]]][[1]]/Flatten[vec1d[δ, g1, g2, k].Transpose[vec1[δ, g1, g2, k]]][[1]]
g1 = 1; g2 = 1;
Plot3D[
{Re[En1[δ, g1, g2, k]]},
{δ, -2, 2}, {k, 0, 2},
ColorFunction -> Function[{δ, k, z}, ColorData["TemperatureMap"][sz1[δ, g1, g2, k]]],
ColorFunctionScaling -> False,
PlotLegends -> BarLegend[{ColorData["TemperatureMap"], {-1, 1}}],
BoxRatios -> {1, 1, 1}
]

ご覧のとおり、色は関数に応答していますsz1
。ただし、色のグラデーションが直線的ではないように見えるため、私の凡例には問題があります。凡例の色を-1から1まで直線的に変化させる方法はありますか?
プロットsz1
すると、$\delta$ 固定kの場合、つまり
Plot3D[{sz1[δ, g1, g2, k]}, {δ, -2, 2}, {k, 0, 2}, AxesLabel -> {"δ", "k"}]

ただし、の3Dプロットの色は、色Re[En1]
に対して奇数ではありません。これには何か理由がありますか?
回答
3 tad Dec 04 2020 at 11:45
凡例の色関数を明示的に再スケーリングできます。
BarLegend[{ColorData["TemperatureMap"][Rescale[#, {-1, 1}]] &, {-1, 1}}]
それがないと、凡例はカラー関数にデフォルトの範囲0から1を使用しているように見えます。したがって、ゼロ未満の値は、ゼロに対応する色にクリップされます。
改訂された質問に対処するために、プロットの色関数を再スケーリングすることもできます。
ColorFunction -> Function[{\[Delta], k, z},
ColorData["TemperatureMap"][Rescale[sz1[\[Delta], g1, g2, k], {-1, 1}]]
]
ViewPoint-> Topを設定して、色の変化をより明確に表示します。

ps、En1の定義にタイプミスがあります。最後の要素として、Iとdeltaの間にスペースを設けるつもりだと思います。