I have some function of two variables (which happens to be the error in some approximation I'm interested in). I'd like to get a density plot of the function, such that in regions when the function is zero, the plot is white, and then there is shading in two different colours when it is positive or negative. Here is an example of what I'd like to get.

An example

When the range is not symmetric around zero, by default zero no longer corresponds to white. It's not too hard to fix this case-by-case, by looking at what the range of the function is and changing the ColorFunction accordingly:

ColorFunction -> (ColorData["RedGreenSplit", .5 + #/myScaling] &), ColorFunctionScaling -> False

But this requires that I first somehow work out what value of myScaling to plug in manually each time. It would be nice to be able to do this automatically: get Mathematica to do what it usually does with ColorFunctionScaling, but with the constraint that the chosen range is centred at 0.

[Related: Change the colour scheme in DensityPlots to make the zero white]


1 Answer 1


You can get a color gradient that is symmetric around zero using a custom Blend as the ColorFunction, plus ColorFunctionScaling -> False.

DensityPlot[x + y , {x, -2, 2}, {y, -3, 2}, 
 ColorFunction -> (Blend[{{-5, Green}, {0, White}, {4, Red}}, #] &), 
 ColorFunctionScaling -> False]

Knowing the minimum and maximum of the data range is probably best handled as a custom function along the lines of the following:

niceDensityPlot[f_, {xmin_, xmax_}, {ymin_, ymax_}, color1_: Green, 
   color2_: Red] /; xmin < 0 && xmax > 0 && ymin < 0 && ymax > 0 :=
 With[{zmin = FindMinValue[f[x, y], {{x, 0}, {y, 0}}], 
   zmax = FindMaxValue[{f[x, y], x >= xmin, x <= xmax, y >= ymin, 
      y <= ymax}, {{x, 0}, {y, 0}}] }, 
  DensityPlot[f[x, y] , {x, xmin, xmax}, {y, ymin, ymax}, 
   ColorFunction -> (Blend[{{zmin, color1}, {0, White}, {zmax, 
         color2}}, #] &), ColorFunctionScaling -> False]]
  • $\begingroup$ Thanks for the answer. (Though I guess NMaxValue rather than FindMaxValue is a better choice, since it finds a global, not local, maximum). $\endgroup$ Commented Apr 22, 2015 at 17:18
  • $\begingroup$ I have to admit I didn't test the function extensively. Glad I could help! By the way, according to the documentation, NMaxValue etc also only find local minima, unless f is linear. $\endgroup$
    – Verbeia
    Commented Apr 22, 2015 at 22:39

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.