class_docstr: Grandparent class for plotting
  modes. Serves as interface for
  registration, lookup, and init
  of modes.
  
  To create a new plot mode,
  inherit from PlotModeBase
  or one of its children, such
  as PlotSurface or PlotCurve.
class_docstr_tok: ["Grandparent","class","for","plotting","modes",".","Serves","as","interface","for","registration",",","lookup",",","and","init","of","modes",".","To","create","a","new","plot","mode",",","inherit","from","PlotModeBase","or","one","of","its","children",",","such","as","PlotSurface","or","PlotCurve","."]
code: def _find_i_vars(functions, intervals):
      i_vars = []
  
      # First, collect i_vars in the
      # order they are given in any
      # intervals.
      for i in intervals:
          if i.v is None:
              continue
          elif i.v in i_vars:
              raise ValueError(
                  ("Multiple intervals given " "for %s.") % (str(i.v))
              )
          i_vars.append(i.v)
  
      # Then, find any remaining
      # i_vars in given functions
      # (aka d_vars)
      for f in functions:
          for a in f.free_symbols:
              if a not in i_vars:
                  i_vars.append(a)
  
      return i_vars
  
imports: from .plot_interval import PlotInterval
  from .plot_object import PlotObject
  from .util import parse_option_string
  from sympy.core.symbol import Symbol
  from sympy.core.sympify import sympify
  from sympy.geometry.entity import GeometryEntity
  from sympy.utilities.iterables import is_sequence
label_desc: Use image node_id 8 for calling the PlotMode obj's underlying member method code with example usage: obj._find_i_vars(functions, intervals) and returns: i_vars