code: def strategy(data, params):
          
          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
docs: Dodge overlapping interval
  
          Assumes that each set has the same horizontal position.