code: def createCanvas(self, parent):
      self.lines = []
      self.figure = Figure()
      self.canvas = FigureCanvas(parent, -1, self.figure)
      self.canvas.callbacks.connect(
          "button_press_event", self.mouseDown
      )
      self.canvas.callbacks.connect(
          "motion_notify_event", self.mouseMotion
      )
      self.canvas.callbacks.connect(
          "button_release_event", self.mouseUp
      )
      self.state = ""
      self.mouseInfo = (None, None, None, None)
      self.f0 = Param(2.0, minimum=0.0, maximum=6.0)
      self.A = Param(1.0, minimum=0.01, maximum=2.0)
      self.createPlots()
  
      # Not sure I like having two params attached to the same Knob,
      # but that is what we have here... it works but feels kludgy -
      # although maybe it's not too bad since the knob changes both params
      # at the same time (both f0 and A are affected during a drag)
      self.f0.attach(self)
      self.A.attach(self)
  
imports: import wx
  import numpy
  from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg
  from matplotlib.figure import Figure
label_desc: Use image node_id 2 for calling the FourierDemoFrame obj's underlying member method code with example usage: obj.createCanvas(parent) without return types