Dodge overlapping interval

        Assumes that each set has the same horizontal position.

def strategy(data, params):
        """
        Dodge overlapping interval

        Assumes that each set has the same horizontal position.
        """
        width = params['width']
        with suppress(TypeError):
            iter(width)
            width = np.asarray(width)
            width = width[data.index]

        udata_group = data['group'].drop_duplicates()

        n = params.get('n', None)
        if n is None:
            n = len(udata_group)
        if n == 1:
            return data

        if not all([col in data.columns for col in ['xmin', 'xmax']]):
            data['xmin'] = data['x']
            data['xmax'] = data['x']

        d_width = np.max(data['xmax'] - data['xmin'])

        # Have a new group index from 1 to number of groups.
        # This might be needed if the group numbers in this set don't
        # include all of 1:n
        udata_group = udata_group.sort_values()
        groupidx = match(data['group'], udata_group)
        groupidx = np.asarray(groupidx) + 1

        # Find the center for each group, then use that to
        # calculate xmin and xmax
        data['x'] = data['x'] + width * ((groupidx - 0.5) / n - 0.5)
        data['xmin'] = data['x'] - (d_width / n) / 2
        data['xmax'] = data['x'] + (d_width / n) / 2

        return data