docs: def display(self, data, x=None, y=None, xlabel=None, ylabel=None,
                  style=None, nlevels=None, levels=None, contour_labels=None,
                  store_data=True, col=0, unzoom=True, auto_contrast=False,
                  contrast_level=0, **kws):
          """
          generic display, using imshow (default) or contour
          """
          if style is not None:
              self.conf.style = style
          self.axes.cla()
          conf = self.conf
          conf.log_scale = False
          conf.rot, conf.flip_ud, conf.flip_lr = False, False, False
          conf.highlight_areas = []
          if 1 in data.shape:
              data = data.squeeze()
          self.data_shape = data.shape
          self.data_range = [0, data.shape[1], 0, data.shape[0]]
          conf.contrast_level = contrast_level
          if auto_contrast:
              conf.contrast_level = 1
          if x is not None:
              self.xdata = np.array(x)
              if self.xdata.shape[0] != data.shape[1]:
                  self.xdata = None
          if y is not None:
              self.ydata = np.array(y)
              if self.ydata.shape[0] != data.shape[0]:
                  self.ydata = None
  
          if xlabel is not None:
              self.xlab = xlabel
          if ylabel is not None:
              self.ylab = ylabel
          if store_data:
              self.conf.data = data
  
          cmap = self.conf.cmap[col]
          if self.conf.style == 'contour':
              if levels is None:
                  levels = self.conf.ncontour_levels
              else:
                  self.conf.ncontour_levels = levels
              if nlevels is None:
                  nlevels = self.conf.ncontour_levels = 9
              nlevels = max(2, nlevels)
              clevels  = np.linspace(data.min(), data.max(), nlevels+1)
              self.conf.contour_levels = clevels
              self.conf.image = self.axes.contourf(data, cmap=self.conf.cmap[col],
                                                   levels=clevels)
  
              self.conf.contour = self.axes.contour(data, cmap=self.conf.cmap[col],
                                                    levels=clevels)
              cmap_name = self.conf.cmap[col].name
              xname = 'gray'
              try:
                  if cmap_name == 'gray_r':
                      xname = 'Reds_r'
                  elif cmap_name == 'gray':
                      xname = 'Reds'
                  elif cmap_name.endswith('_r'):
                      xname = 'gray_r'
              except:
                  pass
              self.conf.contour.set_cmap(getattr(colormap, xname))
  
              if contour_labels is None:
                  contour_labels = self.conf.contour_labels
              if contour_labels:
                  self.axes.clabel(self.conf.contour, fontsize=10, inline=1)
              if hasattr(self.contour_callback , '__call__'):
                  self.contour_callback(levels=clevels)
          else:
              if data.max() == data.min():
                  img = data
              else:
                  img = (data - data.min()) /(1.0*data.max() - data.min())
              self.conf.image = self.axes.imshow(img, cmap=self.conf.cmap[col],
                                                 interpolation=self.conf.interp)
  
          self.axes.set_axis_off()
          if unzoom:
              self.unzoom_all()
          if hasattr(self.data_callback, '__call__'):
              self.data_callback(data, x=x, y=y, **kws)
  
          self.conf.indices = None
          self.indices_thread = Thread(target=self.calc_indices, args=(data.shape, ))
          self.indices_thread.start()