docs: def polyplot(df, projection=None,
               extent=None,
               figsize=(8, 6), ax=None,
               edgecolor='black',
               facecolor='None', **kwargs):
      """
      Trivial polygonal plot.
  
      Parameters
      ----------
      df : GeoDataFrame
          The data being plotted.
      projection : geoplot.crs object instance, optional
          A geographic projection. For more information refer to `the tutorial page on projections
          <https://nbviewer.jupyter.org/github/ResidentMario/geoplot/blob/master/notebooks/tutorials/Projections.ipynb>`_.
      extent : None or (minx, maxx, miny, maxy), optional
          Used to control plot x-axis and y-axis limits manually.
      figsize : tuple, optional
          An (x, y) tuple passed to ``matplotlib.figure`` which sets the size, in inches, of the resultant plot.
          Defaults to (8, 6), the ``matplotlib`` default global.
      figsize : tuple, optional
          An (x, y) tuple passed to ``matplotlib.figure`` which sets the size, in inches, of the resultant plot.
      ax : AxesSubplot or GeoAxesSubplot instance, optional
          A ``matplotlib.axes.AxesSubplot`` or ``cartopy.mpl.geoaxes.GeoAxesSubplot`` instance. Defaults to a new axis.
      kwargs: dict, optional
          Keyword arguments to be passed to the underlying ``matplotlib`` `Polygon patches
          <http://matplotlib.org/api/patches_api.html#matplotlib.patches.Polygon>`_.
  
      Returns
      -------
      ``AxesSubplot`` or ``GeoAxesSubplot``
          The plot axis
  
      Examples
      --------
  
      The polyplot can be used to draw simple, unembellished polygons. A trivial example can be created with just a
      geometry and, optionally, a projection.
  
      .. code-block:: python
  
          import geoplot as gplt
          import geoplot.crs as gcrs
          gplt.polyplot(boroughs, projection=gcrs.AlbersEqualArea())
  
  
      .. image:: ../figures/polyplot/polyplot-initial.png
  
      However, note that ``polyplot`` is mainly intended to be used in concert with other plot types.
  
      .. code-block:: python
  
          ax = gplt.polyplot(boroughs, projection=gcrs.AlbersEqualArea())
          gplt.pointplot(collisions[collisions['BOROUGH'].notnull()], projection=gcrs.AlbersEqualArea(),
                         hue='BOROUGH', categorical=True,
                         legend=True, edgecolor='white', linewidth=0.5, legend_kwargs={'loc': 'upper left'},
                         ax=ax)
  
  
      .. image:: ../figures/polyplot/polyplot-stacked.png
  
      Additional keyword arguments are passed to the underlying ``matplotlib`` `Polygon patches
      <http://matplotlib.org/api/patches_api.html#matplotlib.patches.Polygon>`_.
  
      .. code-block:: python
  
          ax = gplt.polyplot(boroughs, projection=gcrs.AlbersEqualArea(),
                             linewidth=0, facecolor='lightgray')
  
  
      .. image:: ../figures/polyplot/polyplot-kwargs.png
      """
      # Initialize the figure.
      fig = _init_figure(ax, figsize)
  
      if projection:
          # Properly set up the projection.
          projection = projection.load(df, {
              'central_longitude': lambda df: np.mean(np.array([p.x for p in df.geometry.centroid])),
              'central_latitude': lambda df: np.mean(np.array([p.y for p in df.geometry.centroid]))
          })
  
          # Set up the axis.
          if not ax:
              ax = plt.subplot(111, projection=projection)
  
      else:
          if not ax:
              ax = plt.gca()
  
      # Clean up patches.
      _lay_out_axes(ax, projection)
  
      # Immediately return if input geometry is empty.
      if len(df.geometry) == 0:
          return ax
  
      # Set extent.
      extrema = _get_envelopes_min_maxes(df.geometry.envelope.exterior)
      _set_extent(ax, projection, extent, extrema)
  
      # Finally we draw the features.
      if projection:
          for geom in df.geometry:
              features = ShapelyFeature([geom], ccrs.PlateCarree())
              ax.add_feature(features, facecolor=facecolor, edgecolor=edgecolor, **kwargs)
      else:
          for geom in df.geometry:
              try:  # Duck test for MultiPolygon.
                  for subgeom in geom:
                      feature = descartes.PolygonPatch(subgeom, facecolor=facecolor, edgecolor=edgecolor, **kwargs)
                      ax.add_patch(feature)
              except (TypeError, AssertionError):  # Shapely Polygon.
                  feature = descartes.PolygonPatch(geom, facecolor=facecolor, edgecolor=edgecolor, **kwargs)
                  ax.add_patch(feature)
  
      return ax