code: def new_canvas(self, figure=None, col=1, row=1, projection='2d', xlabel=None, ylabel=None, zlabel=None, title=None, xlim=None, ylim=None, zlim=None, **kwargs):
          
          raise NotImplementedError("Implement all plot functions in AbstractPlottingLibrary in order to use your own plotting library")
docs: Return a canvas, kwargupdate for your plotting library. 
  
          if figure is not None, create a canvas in the figure
          at subplot position (col, row).
          
          This method does two things, it creates an empty canvas
          and updates the kwargs (deletes the unnecessary kwargs)
          for further usage in normal plotting.
          
          the kwargs are plotting library specific kwargs!
  
          :param {'2d'|'3d'} projection: The projection to use.
  
          E.g. in matplotlib this means it deletes references to ax, as
          plotting is done on the axis itself and is not a kwarg. 
  
          :param xlabel: the label to put on the xaxis
          :param ylabel: the label to put on the yaxis
          :param zlabel: the label to put on the zaxis (if plotting in 3d)
          :param title: the title of the plot
          :param legend: if True, plot a legend, if int make legend rows in the legend
          :param (float, float) xlim: the limits for the xaxis
          :param (float, float) ylim: the limits for the yaxis
          :param (float, float) zlim: the limits for the zaxis (if plotting in 3d)