docs: def oplot(self, xdata, ydata, side='left', label=None,
                xlabel=None, ylabel=None, y2label=None, title=None,
                dy=None, ylog_scale=None, xlog_scale=None, grid=None,
                xmin=None, xmax=None, ymin=None, ymax=None,
                color=None, style=None, drawstyle=None,
                linewidth=2, marker=None, markersize=None,
                refresh=True, show_legend=None,
                legend_loc='best', legend_on=True, delay_draw=False,
                bgcolor=None, framecolor=None, gridcolor=None,
                labelfontsize=None, legendfontsize=None,
                fullbox=None, axes_style=None, zorder=None, viewpad=None, **kws):
          """ basic plot method, overplotting any existing plot """
          self.cursor_mode = 'zoom'
          conf = self.conf
          conf.plot_type = 'lineplot'
          axes = self.axes
          if side == 'right':
              axes = self.get_right_axes()
          # set y scale to log/linear
          if ylog_scale is not None:
              conf.yscale = {False:'linear', True:'log'}[ylog_scale]
  
          if xlog_scale is not None:
              conf.xscale = {False:'linear', True:'log'}[xlog_scale]
  
          axes.xaxis.set_major_formatter(FuncFormatter(self.xformatter))
          if self.use_dates:
              xdata = [datetime.fromtimestamp(i) for i in xdata]
              xdata = dates.date2num(xdata)
              # axes.xaxis.set_major_locator(dates.AutoDateLocator())
  
          if linewidth is None:
              linewidth = 2
  
          if viewpad is not None:
              conf.viewpad = viewpad
  
          if xlabel is not None:
              self.set_xlabel(xlabel, delay_draw=delay_draw)
          if ylabel is not None:
              self.set_ylabel(ylabel, delay_draw=delay_draw)
          if y2label is not None:
              self.set_y2label(y2label, delay_draw=delay_draw)
          if title  is not None:
              self.set_title(title, delay_draw=delay_draw)
          if show_legend is not None:
              conf.set_legend_location(legend_loc, legend_on)
              conf.show_legend = show_legend
  
          if grid is not None:
              conf.show_grid = grid
  
          # set data range for this trace
          datarange = [min(xdata), max(xdata), min(ydata), max(ydata)]
  
          if axes not in conf.user_limits:
              conf.user_limits[axes] = [None, None, None, None]
  
          if xmin is not None:
              conf.user_limits[axes][0] = xmin
          if xmax is not None:
              conf.user_limits[axes][1] = xmax
          if ymin is not None:
              conf.user_limits[axes][2] = ymin
          if ymax is not None:
              conf.user_limits[axes][3] = ymax
  
          if axes == self.axes:
              axes.yaxis.set_major_formatter(FuncFormatter(self.yformatter))
          else:
              axes.yaxis.set_major_formatter(FuncFormatter(self.y2formatter))
  
          n = conf.ntrace
          if zorder is None:
              zorder = 5*(n+1)
          if axes not in conf.axes_traces:
              conf.axes_traces[axes] = []
          conf.axes_traces[axes].append(n)
  
          if bgcolor is not None:
              conf.bgcolor = bgcolor
              axes.set_axis_bgcolor(bgcolor)
          if framecolor is not None:
              self.canvas.figure.set_facecolor(framecolor)
  
          conf.set_trace_zorder(zorder, delay_draw=True)
          if color:
              conf.set_trace_color(color, delay_draw=True)
          if style:
              conf.set_trace_style(style, delay_draw=True)
          if marker:
              conf.set_trace_marker(marker, delay_draw=True)
          if linewidth is not None:
              conf.set_trace_linewidth(linewidth, delay_draw=True)
          if markersize is not None:
              conf.set_trace_markersize(markersize, delay_draw=True)
          if drawstyle is not None:
              conf.set_trace_drawstyle(drawstyle, delay_draw=True)
          if gridcolor is not None:
              conf.gridcolor = gridcolor
          if dy is None:
              _lines = axes.plot(xdata, ydata, drawstyle=drawstyle, zorder=zorder)
          else:
              _lines = axes.errorbar(xdata, ydata, yerr=dy, zorder=zorder)
  
          if axes not in conf.data_save:
              conf.data_save[axes] = []
          conf.data_save[axes].append((xdata, ydata))
  
          if conf.show_grid and axes == self.axes:
              # I'm sure there's a better way...
              for i in axes.get_xgridlines() + axes.get_ygridlines():
                  i.set_color(conf.gridcolor)
                  i.set_zorder(-100)
              axes.grid(True)
          else:
              axes.grid(False)
  
          if (self.conf.xscale == 'log' or self.conf.yscale == 'log'):
              self.set_logscale(xscale=self.conf.xscale,
                                yscale=self.conf.yscale,
                                delay_draw=delay_draw)
  
          if label is None:
              label = 'trace %i' % (conf.ntrace+1)
          conf.set_trace_label(label, delay_draw=True)
          conf.set_trace_datarange(datarange)
          needs_relabel = False
          if labelfontsize is not None:
              conf.labelfont.set_size(labelfontsize)
              needs_relabel = True
  
          if legendfontsize is not None:
              conf.legendfont.set_size(legendfontsize)
              needs_relabel = True
  
          if n < len(conf.lines):
              conf.lines[n] = _lines
          else:
              conf._init_trace(n, 'black', 'solid')
              conf.lines.append(_lines)
  
          # now set plot limits:
          if not delay_draw:
              self.set_viewlimits()
          if refresh:
              conf.refresh_trace(conf.ntrace)
              needs_relabel = True
  
          if conf.show_legend and not delay_draw:
              conf.draw_legend()
  
          if needs_relabel and not delay_draw:
              conf.relabel()
  
          # axes style ('box' or 'open')
          conf.axes_style = 'box'
          if fullbox is not None and not fullbox:
              conf.axes_style = 'open'
          if axes_style in ('open', 'box', 'bottom'):
              conf.axes_style = axes_style
          conf.set_axes_style(delay_draw=delay_draw)
          if not delay_draw:
              self.draw()
              self.canvas.Refresh()
          conf.ntrace = conf.ntrace + 1
          return _lines