Seems to be a bug in GeoRegionValuePlot
. You can fix it by executing the following code:
DownValues@System`GeoPlotsDump`iGeoRegionValuePlot =
DownValues@System`GeoPlotsDump`iGeoRegionValuePlot /.
HoldPattern@
Rescale[
#,
minMax : {0, 1} | PatternSequence[],
{#2[[1]], Plus @@ #2}
] :>
Rescale[#, minMax, #2];
Now the code from the question works as expected:
GeoRegionValuePlot[
EntityClass["Country", "Africa"] -> "LifeExpectancy",
ColorFunctionScaling -> False,
ColorFunction -> (Which[70 < #, Pink, 65 < # <= 70, Blue,
60 < # <= 65, Green, 55 < # <= 60, Gray, 50 < # <= 55, Orange] &),
ImageSize -> 350,
GeoLabels -> ((Tooltip[#1, Row[{#2, Spacer[5], #4}]] &))
]

Why?
It seems the creator of GeoRegionValuePlot
stumbled over the behavior of Rescale
. The following is an excerpt of the code used to preprocess the given ColorFunction
(in System`GeoPlotsDump`iGeoRegionValuePlot
):
cf = (* some wrapper code… *) cfunc[
If[
TrueQ[cscaleQ],
Rescale[#, {#2[[1]], Plus@@#2}],
Rescale[#, {0, 1}, {#2[[1]], Plus@@#2}]
]
] (* some wrapper code… *)&;
Where cf
is the processes ColorFunction
, cfunc
the ColorFunction
specified in the options, and cscaleQ
is ColorFunctionScaling
. cf
is called like this:
cf[#, {Min @ values, Max @ values}]& /@ {(* list of values between 0 and 1 *)}
So the second argument gives the range of the original data, which can directly be supplied as last argument to Rescale
, without the need to add anything together…