code: def make_signature(name, params, common_params, common_param_values):
      
      tokens = []
      seen = set()
  
      def tokens_append(key, value):
          if isinstance(value, str):
              value = "'{}'".format(value)
          tokens.append('{}={}'.format(key, value))
  
      # preferred params come first
      for key in common_params:
          seen.add(key)
          try:
              value = params[key]
          except KeyError:
              value = common_param_values[key]
          tokens_append(key, value)
  
      # other params (these are the geom/stat specific parameters
      for key in (set(params) - seen):
          tokens_append(key, params[key])
  
      # name, 1 opening bracket, 4 spaces in SIGNATURE_TPL
      s1 = name + '('
      s2 = ', '.join(tokens) + ', **kwargs)'
      line_width = 78 - len(s1)
      indent_spaces = ' ' * (len(s1) + 4)
      newline_and_space = '\n' + indent_spaces
      s2_lines = wrap(s2, width=line_width)
      return s1 + newline_and_space.join(s2_lines)
docs: Create a signature for a geom or stat
  
      Gets the DEFAULT_PARAMS (params) and creates are comma
      separated list of the `name=value` pairs. The common_params
      come first in the list, and they get take their values from
      either the params-dict or the common_geom_param_values-dict.