text: """
  =================
  Nested pie charts
  =================
  
  The following examples show two ways to build a nested pie chart
  in Matplotlib. Such charts are often referred to as donut charts.
  
  """
  
  import matplotlib.pyplot as plt
  import numpy as np
  
  ###############################################################################
  # The most straightforward way to build a pie chart is to use the
  # :meth:`pie method <matplotlib.axes.Axes.pie>`
  #
  # In this case, pie takes values corresponding to counts in a group.
  # We'll first generate some fake data, corresponding to three groups.
  # In the inner circle, we'll treat each number as belonging to its
  # own group. In the outer circle, we'll plot them as members of their
  # original 3 groups.
  #
  # The effect of the donut shape is achieved by setting a `width` to
  # the pie's wedges through the `wedgeprops` argument.
  
  
  fig, ax = plt.subplots()
  
  size = 0.3
  vals = np.array([[60., 32.], [37., 40.], [29., 10.]])
  
  cmap = plt.get_cmap("tab20c")
  outer_colors = cmap(np.arange(3)*4)
  inner_colors = cmap(np.array([1, 2, 5, 6, 9, 10]))
  
  ax.pie(vals.sum(axis=1), radius=1, colors=outer_colors,
         wedgeprops=dict(width=size, edgecolor='w'))
  
  ax.pie(vals.flatten(), radius=1-size, colors=inner_colors,
         wedgeprops=dict(width=size, edgecolor='w'))
  
  ax.set(aspect="equal", title='Pie plot with `ax.pie`')
  plt.show()
  
  ###############################################################################
  # However, you can accomplish the same output by using a bar plot on
  # axes with a polar coordinate system. This may give more flexibility on
  # the exact design of the plot.
  #
  # In this case, we need to map x-values of the bar chart onto radians of
  # a circle. The cumulative sum of the values are used as the edges
  # of the bars.
  
  fig, ax = plt.subplots(subplot_kw=dict(polar=True))
  
  size = 0.3
  vals = np.array([[60., 32.], [37., 40.], [29., 10.]])
  #normalize vals to 2 pi
  valsnorm = vals/np.sum(vals)*2*np.pi
  #obtain the ordinates of the bar edges
  valsleft = np.cumsum(np.append(0, valsnorm.flatten()[:-1])).reshape(vals.shape)
  
  cmap = plt.get_cmap("tab20c")
  outer_colors = cmap(np.arange(3)*4)
  inner_colors = cmap(np.array([1, 2, 5, 6, 9, 10]))
  
  ax.bar(x=valsleft[:, 0],
         width=valsnorm.sum(axis=1), bottom=1-size, height=size,
         color=outer_colors, edgecolor='w', linewidth=1, align="edge")
  
  ax.bar(x=valsleft.flatten(),
         width=valsnorm.flatten(), bottom=1-2*size, height=size,
         color=inner_colors, edgecolor='w', linewidth=1, align="edge")
  
  ax.set(title="Pie plot with `ax.bar` and polar coordinates")
  ax.set_axis_off()
  plt.show()
  
  #############################################################################
  #
  # ------------
  #
  # References
  # """"""""""
  #
  # The use of the following functions, methods, classes and modules is shown
  # in this example:
  
  import matplotlib
  matplotlib.axes.Axes.pie
  matplotlib.pyplot.pie
  matplotlib.axes.Axes.bar
  matplotlib.pyplot.bar
  matplotlib.projections.polar
  matplotlib.axes.Axes.set
  matplotlib.axes.Axes.set_axis_off
  