Problemas con Plotlegend

Dec 04 2020

Estoy haciendo un gráfico 3D de la función En1 y atribuyo su color a la función sz1 a continuación, que contiene valores que van de -1 a 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}
]

Como podemos ver, el color responde a la función sz1. Sin embargo, hay un problema con mi leyenda, ya que el degradado de color no parece lineal. ¿Hay alguna forma de imponer que el color de la leyenda varíe linealmente de -1 a 1?

Si trazamos sz1vemos que es extraño con respecto a la$\delta$ para una k fija, es decir,

Plot3D[{sz1[δ, g1, g2, k]}, {δ, -2, 2}, {k, 0, 2}, AxesLabel -> {"δ", "k"}]

Sin embargo, el color del gráfico 3D de Re[En1]no es extraño con respecto al color. ¿Ves alguna razón para esto?

Respuestas

3 tad Dec 04 2020 at 11:45

Puede cambiar la escala explícitamente de la función de color en la leyenda:

BarLegend[{ColorData["TemperatureMap"][Rescale[#, {-1, 1}]] &, {-1, 1}}]

Sin eso, parece que la leyenda usa el rango predeterminado de 0 a 1 para la función de color. Por lo tanto, los valores por debajo de cero se recortan al color correspondiente a cero.

Para abordar su pregunta revisada, también puede cambiar la escala de la función de color en el gráfico:

ColorFunction -> Function[{\[Delta], k, z},
   ColorData["TemperatureMap"][Rescale[sz1[\[Delta], g1, g2, k], {-1, 1}]]
] 

Establecer ViewPoint -> Top para mostrar más claramente la variación de color da:

ps, hay un error tipográfico en su definición de En1: en el último factor creo que tiene la intención de tener un espacio entre I y delta.