code: def plot_efd(coeffs, locus=(0., 0.), image=None, contour=None, n=300):
      
      try:
          import matplotlib.pyplot as plt
      except ImportError:
          print("Cannot plot: matplotlib was not installed.")
          return
  
      N = coeffs.shape[0]
      N_half = int(np.ceil(N / 2))
      n_rows = 2
  
      t = np.linspace(0, 1.0, n)
      xt = np.ones((n,)) * locus[0]
      yt = np.ones((n,)) * locus[1]
  
      for n in _range(coeffs.shape[0]):
          xt += (coeffs[n, 0] * np.cos(2 * (n + 1) * np.pi * t)) + \
                (coeffs[n, 1] * np.sin(2 * (n + 1) * np.pi * t))
          yt += (coeffs[n, 2] * np.cos(2 * (n + 1) * np.pi * t)) + \
                (coeffs[n, 3] * np.sin(2 * (n + 1) * np.pi * t))
          ax = plt.subplot2grid((n_rows, N_half), (n // N_half, n % N_half))
          ax.set_title(str(n + 1))
          if contour is not None:
              ax.plot(contour[:, 1], contour[:, 0], 'c--', linewidth=2)
          ax.plot(yt, xt, 'r', linewidth=2)
          if image is not None:
              ax.imshow(image, plt.cm.gray)
  
      plt.show()
docs: Plot a ``[2 x (N / 2)]`` grid of successive truncations of the series.
  
      .. note::
  
          Requires `matplotlib <http://matplotlib.org/>`_!
  
      :param numpy.ndarray coeffs: ``[N x 4]`` Fourier coefficient array.
      :param list, tuple or numpy.ndarray locus:
          The :math:`A_0` and :math:`C_0` elliptic locus in [#a]_ and [#b]_.
      :param int n: Number of points to use for plotting of Fourier series.