code: def __init__(self):
      app.Canvas.__init__(self, position=(50, 50), keys="interactive")
      ps = self.pixel_scale
  
      # Load the Iris dataset and normalize.
      iris = load_iris()
      position = iris["data"].astype(np.float32)
      n, ndim = position.shape
      position -= position.mean()
      position /= np.abs(position).max()
      v_position = position * 0.75
  
      v_color = ColorArray(["orange", "magenta", "darkblue"])
      v_color = v_color.rgb[iris["group"], :].astype(np.float32)
      v_color *= np.random.uniform(0.5, 1.5, (n, 3))
      v_color = np.clip(v_color, 0, 1)
      v_size = np.random.uniform(2 * ps, 12 * ps, (n, 1)).astype(
          np.float32
      )
  
      self.program = gloo.Program(VERT_SHADER, FRAG_SHADER)
  
      self.program["a_position"] = gloo.VertexBuffer(v_position)
      self.program["a_color"] = gloo.VertexBuffer(v_color)
      self.program["a_size"] = gloo.VertexBuffer(v_size)
  
      self.program["u_pan"] = (0.0, 0.0)
      self.program["u_scale"] = (1.0, 1.0)
  
      self.program["u_vec1"] = (1.0, 0.0, 0.0, 0.0)
      self.program["u_vec2"] = (0.0, 1.0, 0.0, 0.0)
  
      # Circulant matrix.
      circ = np.diagflat(np.ones(ndim - 1), 1)
      circ[-1, 0] = -1 if ndim % 2 == 0 else 1
      self.logcirc = logm(circ)
      # We will solve the equation dX/dt = log(circ) * X in real time
      # to compute the matrix exponential expm(t*log(circ)).
      self.mat = np.eye(ndim)
      self.dt = 0.001
      gloo.set_state(
          clear_color=(1, 1, 1, 1),
          blend=True,
          blend_func=("src_alpha", "one_minus_src_alpha"),
      )
      gloo.set_viewport(0, 0, *self.physical_size)
  
      self._timer = app.Timer("auto", connect=self.on_timer, start=True)
      self.show()
  
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 1 to create a new Canvas object from inherited base classes: app with example: obj = Canvas()