docs: def _plot_x(self, iabscissa=1, x_opt=None, remark=None,
                  annotations=None):
          """If ``x_opt is not None`` the difference to x_opt is plotted
          in log scale
  
          """
          if not hasattr(self, 'x'):
              _print_warning('no x-attributed found, use methods ' +
                             'plot_xrecent or plot_mean', 'plot_x',
                             'CMADataLogger')
              return
          from matplotlib.pyplot import plot, semilogy, hold, text, grid, axis, title
          dat = self  # for convenience and historical reasons
          # modify fake last entry in x for line extension-annotation
          if dat.x.shape[1] < 100:
              minxend = int(1.06 * dat.x[-2, iabscissa])
              # write y-values for individual annotation into dat.x
              dat.x[-1, iabscissa] = minxend  # TODO: should be ax[1]
              if x_opt is None:
                  idx = np.argsort(dat.x[-2, 5:])
                  idx2 = np.argsort(idx)
                  dat.x[-1, 5 + idx] = np.linspace(np.min(dat.x[:, 5:]),
                              np.max(dat.x[:, 5:]), dat.x.shape[1] - 5)
              else: # y-axis is in log
                  xdat = np.abs(dat.x[:, 5:] - np.array(x_opt, copy=False))
                  idx = np.argsort(xdat[-2, :])
                  idx2 = np.argsort(idx)
                  xdat[-1, idx] = np.logspace(np.log10(np.min(abs(xdat[xdat!=0]))),
                              np.log10(np.max(np.abs(xdat))),
                              dat.x.shape[1] - 5)
          else:
              minxend = 0
          self._enter_plotting()
          if x_opt is not None:  # TODO: differentate neg and pos?
              semilogy(dat.x[:, iabscissa], abs(xdat), '-')
          else:
              plot(dat.x[:, iabscissa], dat.x[:, 5:], '-')
          hold(True)
          grid(True)
          ax = array(axis())
          # ax[1] = max(minxend, ax[1])
          axis(ax)
          ax[1] -= 1e-6  # to prevent last x-tick annotation, probably superfluous
          if dat.x.shape[1] < 100:
              yy = np.linspace(ax[2] + 1e-6, ax[3] - 1e-6, dat.x.shape[1] - 5)
              # yyl = np.sort(dat.x[-1,5:])
              if x_opt is not None:
                  # semilogy([dat.x[-1, iabscissa], ax[1]], [abs(dat.x[-1, 5:]), yy[idx2]], 'k-')  # line from last data point
                  semilogy(np.dot(dat.x[-2, iabscissa], [1, 1]),
                           array([ax[2] * (1+1e-6), ax[3] / (1+1e-6)]), 'k-')
              else:
                  # plot([dat.x[-1, iabscissa], ax[1]], [dat.x[-1,5:], yy[idx2]], 'k-') # line from last data point
                  plot(np.dot(dat.x[-2, iabscissa], [1, 1]),
                       array([ax[2] + 1e-6, ax[3] - 1e-6]), 'k-')
              # plot(array([dat.x[-1, iabscissa], ax[1]]),
              #      reshape(array([dat.x[-1,5:], yy[idx2]]).flatten(), (2,4)), '-k')
              for i in rglen(idx):
                  # TODOqqq: annotate phenotypic value!?
                  # text(ax[1], yy[i], 'x(' + str(idx[i]) + ')=' + str(dat.x[-2,5+idx[i]]))
  
                  text(dat.x[-1, iabscissa], dat.x[-1, 5 + i]
                              if x_opt is None else np.abs(xdat[-1, i]),
                       ('x(' + str(i) + ')=' if annotations is None
                          else str(i) + ':' + annotations[i] + "=")
                       + str(dat.x[-2, 5 + i]))
          i = 2  # find smallest i where iteration count differs (in case the same row appears twice)
          while i < len(dat.f) and dat.f[-i][0] == dat.f[-1][0]:
              i += 1
          title('Object Variables (' +
                  (remark + ', ' if remark is not None else '') +
                  str(dat.x.shape[1] - 5) + '-D, popsize~' +
                  (str(int((dat.f[-1][1] - dat.f[-i][1]) / (dat.f[-1][0] - dat.f[-i][0])))
                      if len(dat.f.T[0]) > 1 and dat.f[-1][0] > dat.f[-i][0] else 'NA')
                  + ')')
          self._finalize_plotting()