class_docstr: This is the QT Gui that can be used to manipulate
  the meta data in the Embedding Gui
  
  Assumes layout of the meta-data csv has an id followed
  by pairs of label + color columns
  
  id label0 color0 label1 color1 --- labelN colorN
  .  ...    ...    ...    ...    --- ...    ...
  .  ...    ...    ...    ...    --- ...    ...
docstr: Load the meta data and register the meta selection callbacks
docstr_tok: ["Load","the","meta","data","and","register","the","meta","selection","callbacks"]
code: def init_metadata(
      self, meta_path=None, on_color_change=None, on_select=None
  ):
      """Load the meta data and register the meta selection callbacks"""
      if meta_path is None:
          return
      self.on_color_change = on_color_change
      self.on_select = on_select
      self.meta_path = meta_path
      self.headers = pd.read_csv(meta_path, nrows=0)
      header_names = list(self.headers)
      self.meta_pairs = []
      if len(header_names) % 2 == 0:
          raise RuntimeError(
              """Expecting meta data to comprise an id
                      column followed by pairs of label/color columns"""
          )
      for i in range(1, len(header_names), 2):
          self.meta_pairs.append([header_names[i], header_names[i + 1]])
          self.class_combo.addItem(header_names[i], i)
      self.class_combo.setCurrentIndex(0)
  
file_path: nptsne/demos/ExtendedHSNEDemo/MetaDataViewer.py
imports: import pandas
  from PyQt5.QtWidgets import QWidget, QFormLayout, QVBoxLayout, QComboBox, QLabel, QTableWidget, QTableWidgetItem, QAbstractItemView, QHeaderView
  from PyQt5.QtCore import pyqtSlot
  from PyQt5.QtGui import QColor
label_desc: Use image node_id 2 for calling the MetaDataViewer obj's underlying member method code with example usage: obj.init_metadata(meta_path, on_color_change, on_select) without return types