6
$\begingroup$

Currently I have a plot of a complicated function with gridlines turned on. Is there a way to shade a checkerboard pattern of alternating colors between adjacent grid cells?

So far, I have tried passing a table of rectangles into Prolog. However, I couldn't figure out how to pass in the max/min dimensions of the plot. Moreover, this approach is ugly and cumbersome, especially if I later want to modify the location of the gridlines.

Even better, I would like to shade a custom repeating pattern, specifically the following one:

0 | 0
-----
1 | 0

where 1 denotes {Pink, Opacity[0.1]} and 0 denotes a white background.

$\endgroup$
0

1 Answer 1

8
$\begingroup$

You could make a checkerboard with Mesh funtionality in ParametricPlot:

mesh =
 ParametricPlot[{v, u}, {u, -2, 6}, {v, 0, 20},
  MeshFunctions -> {#2 &, #1 &}, 
  MeshShading -> {{RGBColor[1, 0.9, 0.9], White}, {White, White}},
  Mesh -> {8, 20},
  BoundaryStyle -> None
 ]

enter image description here

Then set it as a background with Prolog:

Plot[5 Sinc[x], {x, 0, 20},
  PlotRange -> All,
  PlotStyle -> {Red, Thick},
  Prolog -> mesh[[1]]
]

enter image description here

This method is quite flexible as you have specific control over the MeshFunctions etc. For example with MeshFunctions -> {Log[Abs@#2] &, Sinc[#1] &} you get:

enter image description here


Automation

The method above as a function for ease of application.

Options[addCheckerboard] =
  {MeshFunctions -> {#1 &, #2 &}, 
   MeshShading   -> {{RGBColor[1, 0.9, 0.9], White}, {White, White}},
   BoundaryStyle -> None};

addCheckerboard[gr_Graphics, opts : OptionsPattern[ParametricPlot]] :=
 {⌊#⌋, ⌈#2⌉} & @@@ PlotRange[gr] /. {{x_, X_}, {y_, Y_}} :>
   Show[gr,
    Prolog ->
     ParametricPlot[{u, v}, {u, x, X}, {v, y, Y},
       opts,
       Mesh -> ({X - x, Y - y} - 1),
       Evaluate @ Options @ addCheckerboard
     ][[1]]
   ]

You should now be able to apply this to any Graphics object as follows:

plot =
  Plot[Evaluate[Table[n^2*BesselJ[n, x], {n, 4}]], {x, 0, 10},
   AspectRatio -> Automatic];

addCheckerboard[plot]

enter image description here

(AspectRatio -> Automatic is included in the example but not necessary for functionality.)

  • You can change the fill color with MeshShading and the grid color with MeshStyle.
  • You can override the regular grid with different MeshFunctions as above.
$\endgroup$
7
  • $\begingroup$ Thank you. I would like to use this in the situation where the x range is known, but the y range is determined based on the range of the function. In other words, the range of u in the parametric plot is unknown (as well as the first argument of Mesh -> {8, 20}). Would there be an easy modification to accomplish this? $\endgroup$
    – pre-kidney
    Commented Jan 28, 2015 at 18:36
  • $\begingroup$ There is one more issue. I need the gridlines to be placed at precisely the integers. It looks like yours are not - they are stretched to fit the range you have specified. $\endgroup$
    – pre-kidney
    Commented Jan 28, 2015 at 18:39
  • $\begingroup$ @pre-kidney by the way I simply have to ask: what's with the name? :^) $\endgroup$
    – Mr.Wizard
    Commented Jan 28, 2015 at 22:32
  • $\begingroup$ @pre-kidney Please see the update. $\endgroup$
    – Mr.Wizard
    Commented Jan 28, 2015 at 23:55
  • $\begingroup$ This is wonderful! But the code is a bit mysterious to me and I'm trying to learn what it's doing. Would there be a way to run it all in a single Plot command, without having to reference the plot and look up its properties using PlotRange[gr]? Essentially, I would like to do this inline without having to reference the plot later. $\endgroup$
    – pre-kidney
    Commented Jan 29, 2015 at 9:41

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.