嵌套饼图

以下示例显示了在Matplotlib中构建嵌套饼图的两种方法。 这些图表通常被称为空心饼图图表。

  1. import matplotlib.pyplot as plt
  2. import numpy as np

构建饼图最简单的方法是使用饼图方法(pie method)

在这种情况下,pie获取与组中的计数相对应的值。我们将首先生成一些假数据,对应三组。在内圈中,我们将每个数字视为属于自己的组。 在外圈,我们将它们绘制为原始3组的成员。

空心饼图形状的效果是通过wedgeprops参数设置馅饼楔形的宽度来实现的。

  1. fig, ax = plt.subplots()
  2. size = 0.3
  3. vals = np.array([[60., 32.], [37., 40.], [29., 10.]])
  4. cmap = plt.get_cmap("tab20c")
  5. outer_colors = cmap(np.arange(3)*4)
  6. inner_colors = cmap(np.array([1, 2, 5, 6, 9, 10]))
  7. ax.pie(vals.sum(axis=1), radius=1, colors=outer_colors,
  8. wedgeprops=dict(width=size, edgecolor='w'))
  9. ax.pie(vals.flatten(), radius=1-size, colors=inner_colors,
  10. wedgeprops=dict(width=size, edgecolor='w'))
  11. ax.set(aspect="equal", title='Pie plot with `ax.pie`')
  12. plt.show()

嵌套饼图示例

但是,您可以通过在具有极坐标系的轴上使用条形图来完成相同的输出。 这可以为绘图的精确设计提供更大的灵活性。

在这种情况下,我们需要将条形图的x值映射到圆的弧度。这些值的累积和用作条的边。

  1. fig, ax = plt.subplots(subplot_kw=dict(polar=True))
  2. size = 0.3
  3. vals = np.array([[60., 32.], [37., 40.], [29., 10.]])
  4. #normalize vals to 2 pi
  5. valsnorm = vals/np.sum(vals)*2*np.pi
  6. #obtain the ordinates of the bar edges
  7. valsleft = np.cumsum(np.append(0, valsnorm.flatten()[:-1])).reshape(vals.shape)
  8. cmap = plt.get_cmap("tab20c")
  9. outer_colors = cmap(np.arange(3)*4)
  10. inner_colors = cmap(np.array([1, 2, 5, 6, 9, 10]))
  11. ax.bar(x=valsleft[:, 0],
  12. width=valsnorm.sum(axis=1), bottom=1-size, height=size,
  13. color=outer_colors, edgecolor='w', linewidth=1, align="edge")
  14. ax.bar(x=valsleft.flatten(),
  15. width=valsnorm.flatten(), bottom=1-2*size, height=size,
  16. color=inner_colors, edgecolor='w', linewidth=1, align="edge")
  17. ax.set(title="Pie plot with `ax.bar` and polar coordinates")
  18. ax.set_axis_off()
  19. plt.show()

嵌套饼图示例2

参考

此示例显示了以下函数、方法、类和模块的使用:

  1. import matplotlib
  2. matplotlib.axes.Axes.pie
  3. matplotlib.pyplot.pie
  4. matplotlib.axes.Axes.bar
  5. matplotlib.pyplot.bar
  6. matplotlib.projections.polar
  7. matplotlib.axes.Axes.set
  8. matplotlib.axes.Axes.set_axis_off

下载这个示例