docs: def _pca_scores(
          scores,
          pc1=0,
          pc2=1,
          fcol=None,
          ecol=None,
          marker='o',
          markersize=30,
          label_scores=None,
          show_covariance_ellipse=True,
          optimize_label_iter=OPTIMIZE_LABEL_ITER_DEFAULT,
          **kwargs
      ):
      """
      Plot a scores plot for two principal components as AxB scatter plot.
  
      Returns the plotted axis.
  
      :param scores: DataFrame containing scores
      :param pc1: Column indexer into scores for PC1
      :param pc2: Column indexer into scores for PC2
      :param fcol: Face (fill) color definition
      :param ecol: Edge color definition
      :param marker: Marker style (matplotlib; default 'o')
      :param markersize: int Size of the marker
      :param label_scores: Index level to label markers with
      :param show_covariance_ellipse: Plot covariance (2*std) ellipse around each grouping
      :param optimize_label_iter: Number of iterations to run label adjustment algorithm
      :return: Generated axes
      """
  
      fig = plt.figure(figsize=(8, 8))
      ax = fig.add_subplot(1,1,1)
      levels = [0,1]    
  
      for c in set(scores.columns.values):
  
          try:
              data = scores[c].values.reshape(2,-1)
          except:
              continue
  
          fc = hierarchical_match(fcol, c, 'k')
          ec = hierarchical_match(ecol, c)
          
          if ec is None:
              ec = fc
  
          if type(markersize) == str:
              # Use as a key vs. index value in this levels
              idx = scores.columns.names.index(markersize)
              s = c[idx]
          elif callable(markersize):
              s = markersize(c)
          else:
              s = markersize
  
          ax.scatter(data[pc1,:], data[pc2,:], s=s, marker=marker, edgecolors=ec, c=fc)
  
          if show_covariance_ellipse and data.shape[1] > 2:
              cov = data[[pc1, pc2], :].T
              ellip = plot_point_cov(cov, nstd=2, linestyle='dashed', linewidth=0.5, edgecolor=ec or fc,
                                     alpha=0.8)  #**kwargs for ellipse styling
              ax.add_artist(ellip)
  
      if label_scores:
          scores_f = scores.iloc[ [pc1, pc2] ]
          idxs = get_index_list( scores_f.columns.names, label_scores )
          texts = []
  
          for n, (x, y) in enumerate(scores_f.T.values):
              t = ax.text(x, y, build_combined_label( scores_f.columns.values[n], idxs, ', '), bbox=dict(boxstyle='round,pad=0.3', fc='#ffffff', ec='none', alpha=0.6))
              texts.append(t)
  
          if texts and optimize_label_iter:
              adjust_text(
                  texts,
                  lim=optimize_label_iter
              )
  
      ax.set_xlabel(scores.index[pc1], fontsize=16)
      ax.set_ylabel(scores.index[pc2], fontsize=16)
      fig.tight_layout()
      return ax