code: def update_shared_sources(f):
      
      def wrapper(self, *args, **kwargs):
          source_cols = self.handles.get('source_cols', {})
          shared_sources = self.handles.get('shared_sources', [])
          for source in shared_sources:
              source.data.clear()
              if self.document and self.document._held_events:
                  self.document._held_events = self.document._held_events[:-1]
  
          ret = f(self, *args, **kwargs)
  
          for source in shared_sources:
              expected = source_cols[id(source)]
              found = [c for c in expected if c in source.data]
              empty = np.full_like(source.data[found[0]], np.NaN) if found else []
              patch = {c: empty for c in expected if c not in source.data}
              source.data.update(patch)
          return ret
      return wrapper
docs: Context manager to ensures data sources shared between multiple
      plots are cleared and updated appropriately avoiding warnings and
      allowing empty frames on subplots. Expects a list of
      shared_sources and a mapping of the columns expected columns for
      each source in the plots handles.