code: def hover_fn(
      self, trace, points, state
  ):  # pylint: disable=unused-argument
      if not points:
          return
      ind = points.point_inds[0]
      if (
          ind == self.last_ind
          or ind > len(self.hover_images)
          or ind < 0
      ):
          return
  
      if self.last_ind == -1:
          self.last_ind, self.last_ind_time = ind, time.time()
      else:
          elapsed = time.time() - self.last_ind_time
          if elapsed < 0.3:
              self.last_ind, self.last_ind_time = ind, time.time()
              if elapsed < 1:
                  return
              # else too much time since update
          # else we have stable ind
  
      import matplotlib.pyplot as plt  # delayed import due to matplotlib threading issue
  
      with self.image_output:
          plt.ioff()
  
          if self.hover_image_reshape:
              img = np.reshape(
                  self.hover_images[ind], self.hover_image_reshape
              )
          else:
              img = self.hover_images[ind]
          if img is not None:
              LinePlot.display.clear_output(wait=True)
              self.image_ax.imshow(img)
          LinePlot.display.display(self.image_figure)
          plt.ion()
  
      return None
  
file_path: tensorwatch/tensorwatch/plotly/embeddings_plot.py
imports: from ..None import image_utils
  import numpy
  from .line_plot import LinePlot
  import time
  from ..None import utils
label_desc: Use image node_id 2 for calling the EmbeddingsPlot obj's underlying member method code with example usage: obj.hover_fn(trace, points, state) and returns: None