I want to make a RegionPlot (or possibly a ContourPlot) in $x$-$y$ space that indicates which among a set of functions is the biggest value for a given $(x, y)$.

Suppose I have (in this example) three functions assembled in a list:

f[x_, y_] = Sin[x*y]
g[x_, y_] = Cos[x*y/2]
h[x_, y_] = Sin[x*y^2/7 + 2 \[Pi]/E]
(*and possibly more...*)

list[x_, y_] = {f[x,y], g[x,y], h[x,y]}

and I want to paint a region blue if f[x] is largest in that region, magenta if g[x] is largest and dark yellow if h[x] is largest. The end result would be collage of colors corresponding to largest among the functions.

Is there a way using functional coding to do this? I'm looking for fastest fastest possible computing speed.

Any hints on possibly helpful Mathematica functions would be welcome.


1 Answer 1


Here's one way to construct the inequalities (see also Plot the plane so different condition has a different color):

fns = {Sin[x*y], Cos[x*y/2], Sin[x*y^2/7 + 2 \[Pi]/E]};
colors = {Blue, Magenta, Darker@Yellow};
rgns = Table[And @@ Thread[fns[[i]] >= Drop[fns, {i}]], {i, Length[fns]}];

  RegionPlot[#1, {x, -2, 2}, {y, -2, 2}, ##2] &,
   {rgns, Thread[PlotStyle -> colors]}], 
  PlotRange -> All]

Mathematica graphics

There are some small gaps. They may be removed in this case with PlotPoints -> 60.


Even though on further consideration, it seems to me that this question is a duplicate of the one I linked to above, I'll add this, because it's fast and uses a small amount of memory. Increase PlotPoints for smoother contours.

plot = ParametricPlot[{x, y}, {x, -2, 2}, {y, -2, 2}, 
   MeshFunctions -> meshfns, Mesh -> {{0}}, Axes -> False];
With[{pts = First@Cases[plot, GraphicsComplex[p_, __] :> p, Infinity]},
 plot /. GraphicsComplex[p_, g_, opts___] :> GraphicsComplex[p,
      plot /. 
       poly : Polygon[pp_] :> {
         Sow[#, First @ Position[Through[meshfns @@ Mean[pts~Part~#]], _?Positive]] & /@ 
      {colors[[#1]], Polygon[#2]} &

Mathematica graphics

  • $\begingroup$ Isn't this question an almost exact duplicate of the one you linked to? $\endgroup$
    – user484
    Aug 4, 2014 at 20:43
  • $\begingroup$ @RahulNarain The region functions (from my answer) do not work on this region. So my initial reaction was that there was a difference. But kguler's solution would work here, if Min were replaced with Max. (I didn't consider it until you asked.) $\endgroup$
    – Michael E2
    Aug 4, 2014 at 21:41

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