Drawing minor gridlines

This is what came to my mind

myGridDivision[{min_, max_}, {major_, majorStyle_}, {minor_, minorStyle_}] :=
 Function[divisions,
   Join[{#, majorStyle} & /@ divisions[[1]],
    {#, minorStyle} & /@ Complement[Flatten[#[[2]]], #[[1]]] &@ divisions]
   ][FindDivisions[{min, max}, {major, minor}]]

ListPlot[data, Frame -> True,
 FrameTicks -> {{True, False}, {True, False}},
 PlotRange -> {{0, 100}, {0, 5}},
 GridLines -> {
   myGridDivision[{0, 100}, {5, GrayLevel[.5]}, {5, GrayLevel[.8]}],
   myGridDivision[{0, 5}, {5, GrayLevel[.5]}, {5, GrayLevel[.8]}]
   }]

enter image description here

You can always set min/max to far more negative/positive large than the actual range of the plot to avoid manully determine the range.

Unfortunately, for some custom set FrameTicks cases, it seems not possible to auto-determine the FrameTicks setting using AbsoluteOptions[(*graphics*), FrameTicks] after the plot has been generated.. Maybe a home-made frame-ticks generator along with this one would be good.


Not elegant, but at least it's quite short :)

makeGrid[{minX_, maxX_}, {minY_, MaxY_}, {xStep_, yStep_}] := 
 {AbsoluteThickness[.25],
   Table[{If[Mod[x, 10] == 0, Black, LightGray], 
     Line[{{x , -100}, {x , 100}}]}, {x, minX, maxX, xStep}],
   Table[{If[Mod[y, 1] == 0, Black, LightGray], 
     Line[{{-100, y}, {100, y}}]}, {y, minY, MaxY, yStep}]}

ListPlot[data, Frame -> True, 
 Prolog -> makeGrid[{0, 100}, {0, 10}, {10, .1}]]

rules


Update 2: If it is ok to have minor and major gridlines with the same style, then the simplest solution is to use Full as the option setting:

ListPlot[data, Frame -> True, GridLines -> {Full, Full}]

enter image description here

AFAIK, this setting is not documented.

Update: A more convenient approach is to use the function Charting`FindTicks:

ClearAll[gridLinesF2]
gridLinesF2[majorstyle_: Thick, minorstyle_: Thin] := Replace[
   DeleteDuplicatesBy[Charting`FindTicks[{0, 1}, {0, 1}][##][[All, ;; 2]], First], 
     {{a_, ""} :> {a, minorstyle}, {a_, b_} :> {a, majorstyle}}, 1] &

ListPlot[data, Frame -> True, GridLines -> {gridLinesF2[Blue, Green], gridLinesF2[]}]

enter image description here

Original answer:

GridLines option setting can be a function. Using FindDivisions (as in Silvia's answer) without specific values for min and max (i.e., letting FindDivisions use automatically generated min and max values) and using {6, 6} as the second argument we get major and minor GridLines that match automatic ticks.

ClearAll[gridLinesF]
gridLinesF[style1_: Directive[Thickness[.003], GrayLevel[.5]], 
  style2_: Directive[Thin, GrayLevel[.9]], divs_:{6, 6}] := 
 Join[Thread[{#, style1}], 
   Thread[{DeleteCases[DeleteDuplicates[Join @@ #2], Alternatives @@ #], style2}]] & @@
 FindDivisions[{##}, divs] &

Examples:

data = Table[{x, Log@x}, {x, 100}];
ListPlot[data, Frame -> True, GridLines -> {gridLinesF[], gridLinesF[]}]

enter image description here

ListPlot[{RandomInteger[100], RandomReal[127]} + # & /@ data, 
 Frame -> True, GridLines -> {gridLinesF[], gridLinesF[]}]

enter image description here

Graphics[Circle[], Frame -> True, GridLines -> {gridLinesF[Red], gridLinesF[Blue]}]

enter image description here

Graphics[{}, PlotRange -> {{0, 1}, {0, 1}}, Frame -> True, 
 GridLines -> {gridLinesF[Directive[Thickness[.01], Red], Orange], 
   gridLinesF[Directive[Thickness[.01], Blue], Green]}]

enter image description here

Tags:

Plotting