'Plot a pie chart.
Make a pie chart of array *x*.  The fractional area of each
wedge is given by ``x/sum(x)``.  If ``sum(x) <= 1``, then the
values of x give the fractional area directly and the array
will not be normalized.  The wedges are plotted
counterclockwise, by default starting from the x-axis.
Parameters
x : array-like
The input array used to make the pie chart.
explode : array-like, optional, default: None
If not *None*, is a ``len(x)`` array which specifies the
fraction of the radius with which to offset each wedge.
labels : list, optional, default: None
A sequence of strings providing the labels for each wedge
colors : array-like, optional, default: None
A sequence of matplotlib color args through which the pie chart
will cycle.  If `None`, will use the colors in the currently
active cycle.
autopct : None (default), string, or function, optional
If not *None*, is a string or function used to label the wedges
with their numeric value.  The label will be placed inside the
wedge.  If it is a format string, the label will be ``fmt%pct``.
If it is a function, it will be called.
pctdistance : float, optional, default: 0.6
The ratio between the center of each pie slice and the
start of the text generated by *autopct*.  Ignored if
*autopct* is *None*.
shadow : bool, optional, default: False
Draw a shadow beneath the pie.
labeldistance : float, optional, default: 1.1
The radial distance at which the pie labels are drawn
startangle : float, optional, default: None
If not *None*, rotates the start of the pie chart by *angle*
degrees counterclockwise from the x-axis.
radius : float, optional, default: None
The radius of the pie, if *radius* is *None* it will be set to 1.
counterclock : bool, optional, default: True
Specify fractions direction, clockwise or counterclockwise.
wedgeprops : dict, optional, default: None
Dict of arguments passed to the wedge objects making the pie.
For example, you can pass in``wedgeprops = {\'linewidth\': 3}``
to set the width of the wedge border lines equal to 3.
For more details, look at the doc/arguments of the wedge object.
By default ``clip_on=False``.
textprops : dict, optional, default: None
Dict of arguments to pass to the text objects.
center :  list of float, optional, default: (0, 0)
Center position of the chart. Takes value (0, 0) or is a
sequence of 2 scalars.
frame : bool, optional, default: False
Plot axes frame with the chart if true.
rotatelabels : bool, optional, default: False
Rotate each label to the angle of the corresponding slice if true.
Returns
patches : list
A sequence of :class:`matplotlib.patches.Wedge` instances
texts : list
A is a list of the label :class:`matplotlib.text.Text` instances.
autotexts : list
A is a list of :class:`~matplotlib.text.Text` instances for the
numeric labels. Is returned only if parameter *autopct* is
not *None*.
Notes
The pie chart will probably look best if the figure and axes are
square, or the Axes aspect is equal.'

@_preprocess_data(replace_names=[u'x', u'explode', u'labels', u'colors'], label_namer=None)
def pie(self, x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, rotatelabels=False):

    x = np.array(x, np.float32)
    sx = x.sum()
    if (sx > 1):
        x /= sx
    if (labels is None):
        labels = ([u''] * len(x))
    if (explode is None):
        explode = ([0] * len(x))
    if (len(x) != len(labels)):
        raise ValueError(u"'label'    must    be    of    length    'x'")
    if (len(x) != len(explode)):
        raise ValueError(u"'explode'    must    be    of    length    'x'")
    if (colors is None):
        get_next_color = self._get_patches_for_fill.get_next_color
    else:
        color_cycle = itertools.cycle(colors)
        def get_next_color():
            return six.next(color_cycle)
    if (radius is None):
        radius = 1
    if (startangle is None):
        theta1 = 0
    else:
        theta1 = (startangle / 360.0)
    if (wedgeprops is None):
        wedgeprops = {}
    wedgeprops.setdefault(u'clip_on', False)
    if (textprops is None):
        textprops = {}
    textprops.setdefault(u'clip_on', False)
    texts = []
    slices = []
    autotexts = []
    i = 0
    for (frac, label, expl) in zip(x, labels, explode):
        (x, y) = center
        theta2 = ((theta1 + frac) if counterclock else (theta1 - frac))
        thetam = (((2 * math.pi) * 0.5) * (theta1 + theta2))
        x += (expl * math.cos(thetam))
        y += (expl * math.sin(thetam))
        w = mpatches.Wedge((x, y), radius, (360.0 * min(theta1, theta2)), (360.0 * max(theta1, theta2)), facecolor=get_next_color(), **wedgeprops)
        slices.append(w)
        self.add_patch(w)
        w.set_label(label)
        if shadow:
            shad = mpatches.Shadow(w, (-0.02), (-0.02))
            shad.set_zorder((0.9 * w.get_zorder()))
            shad.set_label(u'_nolegend_')
            self.add_patch(shad)
        xt = (x + ((labeldistance * radius) * math.cos(thetam)))
        yt = (y + ((labeldistance * radius) * math.sin(thetam)))
        label_alignment_h = (((xt > 0) and u'left') or u'right')
        label_alignment_v = u'center'
        label_rotation = u'horizontal'
        if rotatelabels:
            label_alignment_v = (((yt > 0) and u'bottom') or u'top')
            label_rotation = (np.rad2deg(thetam) + (0 if (xt > 0) else 180))
        t = self.text(xt, yt, label, size=rcParams[u'xtick.labelsize'], horizontalalignment=label_alignment_h, verticalalignment=label_alignment_v, rotation=label_rotation, **textprops)
        texts.append(t)
        if (autopct is not None):
            xt = (x + ((pctdistance * radius) * math.cos(thetam)))
            yt = (y + ((pctdistance * radius) * math.sin(thetam)))
            if isinstance(autopct, six.string_types):
                s = (autopct % (100.0 * frac))
            elif callable(autopct):
                s = autopct((100.0 * frac))
            else:
                raise TypeError(u'autopct    must    be    callable    or    a    format    string')
            t = self.text(xt, yt, s, horizontalalignment=u'center', verticalalignment=u'center', **textprops)
            autotexts.append(t)
        theta1 = theta2
        i += 1
    if (not frame):
        self.set_frame_on(False)
        self.set_xlim((((-1.25) + center[0]), (1.25 + center[0])))
        self.set_ylim((((-1.25) + center[1]), (1.25 + center[1])))
        self.set_xticks([])
        self.set_yticks([])
    if (autopct is None):
        return (slices, texts)
    else:
        return (slices, texts, autotexts)
