code: def draw_compare(f, arg, edges, data, errors=None, ax=None, grid=True, normed=False, parts=False):
      
      from matplotlib import pyplot as plt
  
      # arg is either map or tuple
      ax = plt.gca() if ax is None else ax
      arg = parse_arg(f, arg, 1) if isinstance(arg, dict) else arg
      x = (edges[:-1] + edges[1:]) / 2.0
      bw = np.diff(edges)
      yf = vector_apply(f, x, *arg)
      total = np.sum(data)
      if normed:
          ax.errorbar(x, data / bw / total, errors / bw / total, fmt='.b',
                      zorder=0)
          ax.plot(x, yf, 'r', lw=2, zorder=2)
      else:
          ax.errorbar(x, data, errors, fmt='.b', zorder=0)
          ax.plot(x, yf * bw, 'r', lw=2, zorder=2)
  
      # now draw the parts
      if parts:
          if not hasattr(f, 'eval_parts'):
              warn(RuntimeWarning('parts is set to True but function does '
                                  'not have eval_parts method'))
          else:
              scale = bw if not normed else 1.
              parts_val = list()
              for tx in x:
                  val = f.eval_parts(tx, *arg)
                  parts_val.append(val)
              py = zip(*parts_val)
              for y in py:
                  tmpy = np.array(y)
                  ax.plot(x, tmpy * scale, lw=2, alpha=0.5)
      plt.grid(grid)
      return x, yf, data
docs: TODO: this needs to be rewritten