code: def on_timer(self, event):
      # We advance the numerical solver from as many dt there have been
      # since the last update.
      for t in np.arange(0.0, event.dt, self.dt):
          self.mat += self.dt * np.dot(self.logcirc, self.mat).real
      # We just keep the first two columns of the matrix.
      self.program["u_vec1"] = self.mat[:, 0].squeeze()
      self.program["u_vec2"] = self.mat[:, 1].squeeze()
      self.update()
  
file_path: vispy/examples/demo/gloo/ndscatter.py
imports: from vispy import gloo
  from vispy import app
  from vispy.color import ColorArray
  from vispy.io import load_iris
  import numpy
  from scipy.linalg import logm
label_desc: Use image node_id 2 for calling the Canvas obj's underlying member method code with example usage: obj.on_timer(event) without return types