class_docstr: Defines a set of plots to produce.
  
  This will create plots for the cartesian product of the parameters in this class.
  See :class:`BenchmarkSuite` if you want a union of parameters.
class_docstr_tok: ["Defines","a","set","of","plots","to","produce",".","This","will","create","plots","for","the","cartesian","product","of","the","parameters","in","this","class",".","See",":","class",":","`","BenchmarkSuite","`","if","you","want","a","union","of","parameters","."]
docstr: Get ``line_by``, or a default value if ``line_by`` is ``None``.
docstr_tok: ["Get","``","line_by","``",",","or","a","default","value","if","``","line_by","``","is","``","None","``","."]
code: def safe_line_by(self) -> GroupingSpec:
      """
      Get ``line_by``, or a default value if ``line_by`` is ``None``.
      """
      if self.line_by is None:
          used_by: Set[GroupingKey] = (
              set(self.file_by.by)
              | set(self.column_by.by)
              | set(self.row_by.by)
          )
          line_by = set(GroupingKey) - used_by
          sorted_line_by: Sequence[GroupingKey] = sorted(line_by, key=lambda k: k.key_cost)  # type: ignore[arg-type] # for lambda
          return GroupingSpec(sorted_line_by, minimise=True)
  
      return self.line_by
  
imports: from dataclasses import dataclass
  from typing import Any, Collection, Dict, List, Optional, Sequence, Set, Tuple
  import pandas
  from benchmark.dataset_api import DatasetFactory
  from benchmark.grouping import GroupingKey, GroupingSpec
  from benchmark.model_api import ModelFactory
  from benchmark.plotter_api import Plotter
  from benchmark.registry import Named, Registry
label_desc: Use image node_id 2 for calling the BenchmarkSet obj's underlying member method code with example usage: obj.safe_line_by() and returns: self, GroupingSpec