class_docstr: Granger causality matrix.
code: def _annotate(self) -> None:
      df = self.data
      cmap = cmapper(
          self.colorbar_limit[0],
          self.colorbar_limit[1],
          self.accept_cmap,
          as_hex=False,
      )
      self._annotations = []
      for i, row in enumerate(df.values):
          for j, val in enumerate(row):
              if not val or val != val:
                  continue
              *bg, _ = cmap(val)
              fg = (
                  ccontrast(*bg)
                  if val < self.critical
                  else self.fg_reject
              )
              lag = self.dfl.iloc[i, j]
              self._annotations.append(
                  go.layout.Annotation(
                      text=self.labels_format.format(val)
                      + f"<br>lag: {lag}",
                      font=dict(color=fg, size=10),
                      x=df.columns[j],
                      y=df.index[i],
                      xref="x1",
                      yref="y1",
                      showarrow=False,
                  )
              )
  
file_path: tslumen/tslumen/plot/interactive/misc.py
imports: from typing import Any
  import pandas
  from tslumen.plot.interactive.base import go
  from tslumen.plot.interactive.comparison import Heatmap
  from tslumen.plot.utils import cmapper, cmap_to_list, ccontrast
label_desc: Use image node_id 2 for calling the GrangerMatrix obj's underlying member method code with example usage: obj._annotate() without return types