code: def invisible_canvas():
      
      with preserve_current_canvas():
          with preserve_batch_state():
              ROOT.gROOT.SetBatch()
              c = ROOT.TCanvas()
          try:
              c.cd()
              yield c
          finally:
              c.Close()
              c.IsA().Destructor(c)
docs: Context manager yielding a temporary canvas drawn in batch mode, invisible
      to the user. Original state is restored on exit.
  
      Example use; obtain X axis object without interfering with anything::
  
          with invisible_canvas() as c:
              efficiency.Draw()
              g = efficiency.GetPaintedGraph()
              return g.GetXaxis()