code: def __init__(self):
      app.Canvas.__init__(
          self,
          title="Windbarb plot",
          keys="interactive",
          size=(830, 430),
      )
  
      self.windbarb_length = 25
      self.grid_spacing = 50
  
      self.grid_coords = None
      self.line_vertices = None
      self.last_mouse = (0, 0)
  
      self.generate_grid()
  
      direction_vectors = (self.grid_coords - self.last_mouse).astype(
          np.float32
      )
      direction_vectors[:] /= 10
      direction_vectors[:, 1] *= -1
  
      self.visual = WindbarbVisual(
          pos=self.grid_coords,
          wind=direction_vectors,
          trig=False,
          edge_color="black",
          face_color="black",
          size=self.windbarb_length,
      )
  
      self.visual.events.update.connect(lambda evt: self.update())
      self.visual.transform = NullTransform()
  
      self.show()
  
file_path: vispy/examples/basics/visuals/windbarb_quiver.py
imports: import itertools
  import numpy
  from vispy import app
  from vispy.visuals import WindbarbVisual
  from vispy.visuals.transforms import NullTransform
label_desc: Use image node_id 1 to create a new Canvas object from inherited base classes: app with example: obj = Canvas()