code: def labeller(rows=None, cols=None, multi_line=True,
               default=label_value, **kwargs):
      
      # Sort out the labellers along each dimension
      rows_labeller = as_labeller(rows, default, multi_line)
      cols_labeller = as_labeller(cols, default, multi_line)
  
      def _labeller(label_info):
          # When there is no variable specific labeller,
          # use that of the dimension
          if label_info._meta['dimension'] == 'rows':
              margin_labeller = rows_labeller
          else:
              margin_labeller = cols_labeller
  
          # Labelling functions expect string values
          label_info = label_info.astype(str)
  
          # Each facetting variable is labelled independently
          for name, value in label_info.iteritems():
              func = as_labeller(kwargs.get(name), margin_labeller)
              new_info = func(label_info[[name]])
              label_info[name] = new_info[name]
  
          if not multi_line:
              label_info = collapse_label_lines(label_info)
  
          return label_info
  
      return _labeller
docs: Return a labeller function
  
      Parameters
      ----------
      rows : str | function | None
          How to label the rows
      cols : str | function | None
          How to label the columns
      multi_line : bool
          Whether to place each variable on a separate line
      default : function | str
          Fallback labelling function. If it is a string,
          it should be the name of one the labelling
          functions provided by plotnine.
      kwargs : dict
          {variable name : function | string} pairs for
          renaming variables. A function to rename the variable
          or a string name.
  
      Returns
      -------
      out : function
          Function to do the labelling