For a side project we used turf.js and set the hex based on the map extent.

var dataConfig = self.dataConfig; self.bounds = self.map.getBounds(); var hexW = (dataConfig.hexWidth / (self.origBounds._northEast.lng - self.origBounds._southWest.lng)) * (self.bounds._northEast.lng - self.bounds._southWest.lng); var hexExtent = [self.bounds._southWest.lng,self.bounds._southWest.lat, self.bounds._northEast.lng, self.bounds._northEast.lat]; self.hexgrid = turf.hexGrid(hexExtent, hexW, dataConfig.hexUnit);

Each usage of the hexgrid is going to be different depending on what you are displaying, so we still had to base it on some number that could be changed from the config. But the cool part is that the hex width is calculated as a proportion of the map extent. As you zoom in and out, the hex is recalculated to be the same proportion as the width was to the original map extent.