I think we are back to the discussion present in the ref guide
To summarise: when an histogram with positive contain only is drawn with option COL the empty bins are not painted … we do not know if they are touched or un-touched (a bin can have a 0 content because it was never touched or touched several times with a sum equal to 0) but they are assumed un-touched.
Sill the histogram minimum being zero, the palette goes from 0 to the maximum …
So what you are looking for is a way to define the palette from the lowest non null value to the highest value.
There is already a simple way to do that:
th2->SetMinimum(th2->GetMinimum(0.)); th2->Draw("colz");