【问题标题】:Double donut chart in matplotlibmatplotlib 中的双甜甜圈图
【发布时间】:2017-10-24 12:10:39
【问题描述】:

好吧,matplotlib 爱好者,我们知道如何绘制donut chart,但是有什么比甜甜圈图更好的呢?双甜甜圈图。具体来说:我们有一组元素属于第一分类的不相交类别和子类别。圆环图应该有外环中的类别切片和内环子类别的切片,显然与外部切片对齐。

有没有提供这个的库或者我们需要在这里解决这个问题?

【问题讨论】:

  • 您可以在同一个图形上绘制两个甜甜圈,其中一个的外半径较小。
  • 这个问题是要我们推荐或者找软件库,还是要问matplotlib怎么做这种情节?

标签: python matplotlib plot charts


【解决方案1】:

要获得双圆环图,您可以在同一个图中绘制任意数量的饼图。因此,外部饼图的楔形将设置为width,而内部饼图的半径将小于或等于1-width

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()
ax.axis('equal')
width = 0.3

cm = plt.get_cmap("tab20c")
cout = cm(np.arange(3)*4)
pie, _ = ax.pie([120,77,39], radius=1, labels=list("ABC"), colors=cout)
plt.setp( pie, width=width, edgecolor='white')

cin = cm(np.array([1,2,5,6,9,10]))
labels = list(map("".join, zip(list("aabbcc"),map(str, [1,2]*3))))
pie2, _ = ax.pie([60,60,37,40,29,10], radius=1-width, labels=labels,
                                      labeldistance=0.7, colors=cin)
plt.setp( pie2, width=width, edgecolor='white')
plt.show()

注意:我在 matplotlib 库中也以 nested pie example 的形式提供了此代码。

【讨论】:

  • 错误跟踪 :TypeError: 'map' 类型的对象没有 len(),对于 Python 3。我该如何修复这个错误?
  • 在 python 2 中:mylist = map(..,..),在 python 3 中:mylist = list(map(..,..))
【解决方案2】:

我改编了您提供的示例;您可以通过在同一个图形上绘制两个甜甜圈来解决您的问题,其中一个的外半径较小。

import matplotlib.pyplot as plt
import numpy as np

def make_pie(sizes, text,colors,labels, radius=1):
    col = [[i/255 for i in c] for c in colors]

    plt.axis('equal')
    width = 0.35
    kwargs = dict(colors=col, startangle=180)
    outside, _ = plt.pie(sizes, radius=radius, pctdistance=1-width/2,labels=labels,**kwargs)
    plt.setp( outside, width=width, edgecolor='white')

    kwargs = dict(size=20, fontweight='bold', va='center')
    plt.text(0, 0, text, ha='center', **kwargs)

# Group colors
c1 = (226, 33, 7)
c2 = (60, 121, 189)

# Subgroup colors
d1 = (226, 33, 7)
d2 = (60, 121, 189)
d3 = (25, 25, 25)

make_pie([100, 80, 90], "", [d1, d3, d2], ['M', 'N', 'F'], radius=1.2)
make_pie([180, 90], "", [c1, c2], ['M', 'F'], radius=1)
plt.show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    相关资源
    最近更新 更多