【问题标题】:How to align a multilevel donut chart in matplotlib?如何在 matplotlib 中对齐多级圆环图?
【发布时间】:2021-04-29 11:26:36
【问题描述】:

在这里需要一些帮助。 我需要将每个子组与它们各自的外部组(每个 25%)对齐,有什么想法可以做到这一点吗?

data = {'Accenture': [3,2,2],
        'Novo BPO': [2.67,3,2],
        'SSC': [1,1,1.5],
        'inHouse': [3,2,1.5]
        }

df = pd.DataFrame(data, columns = ['Accenture','Novo BPO','SSC','inHouse'], index=['Fluidez', '% Savings', 'Escalabilidade'])
df

# Make data: I have 4 groups and 12 subgroups - 3 for each group
group_names=['groupA', 'groupB', 'groupC', 'groupD']
group_size=[25,25,25,25]
subgroup_names=['A.1', 'A.2', 'A.3', 'B.1', 'B.2','B.3', 'C.1', 'C.2', 'C.3','D.1', 'D.2', 'D.3']
subgroup_size=[3,2,2,2.67,3,2,1,1,1.5,3,2,1.5]
 
# Create colors
a, b, c,d=[plt.cm.Blues, plt.cm.Reds, plt.cm.Greens, plt.cm.Greys]
 
# First Ring (outside)
fig, ax = plt.subplots()
ax.axis('equal')
mypie, _ = ax.pie(group_size, radius=1.3, labels=group_names, colors=[a(0.6), b(0.6), c(0.6),d(0.6)] )
plt.setp( mypie, width=0.3, edgecolor='white')
 
# Second Ring (Inside)
mypie2, _ = ax.pie(subgroup_size, radius=1.3-0.3, labels=subgroup_names, labeldistance=0.7, colors=[a(0.5), a(0.4), a(0.3), b(0.5), b(0.4),b(0.3), c(0.6), c(0.5), c(0.4), d(0.3), d(0.2),d(0.4)])
plt.setp( mypie2, width=0.4, edgecolor='white')
plt.margins(0,0)
 
# show it
plt.show()

【问题讨论】:

  • 如果您的问题现在得到解答,请考虑marking 已接受的答案之一。您也可以考虑对有用的答案进行投票。如果没有,请指出缺少的内容。

标签: python matplotlib charts multi-level


【解决方案1】:

您必须明确subgroup_size 和group_size 的值是如何相互关联的! 子组的值是否仅描述每个季度内的比率? 还是真的总共只有四个外部组,但它们的份额不是每个 25%,而您希望将子组的值相加以获得外部组的大小?

# Assuming subgroup_size describes a ratio for each quarter
subgroup_size = np.array(subgroup_size).reshape(4, 3) 
subgroup_size = subgroup_size / subgroup_size.sum(axis=1, keepdims=1)
subgroup_size = subgroup_size.ravel()

# Assuming group_size is not 1/4
group_size = np.array(subgroup_size).reshape(4, 3).sum(axis=1)

【讨论】:

    【解决方案2】:

    您可以直接根据数据框中的信息创建列表:

    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np
    
    data = {'Accenture': [3, 2, 2],
            'Novo BPO': [2.67, 3, 2],
            'SSC': [1, 1, 1.5],
            'inHouse': [3, 2, 1.5]
            }
    
    df = pd.DataFrame(data, columns=['Accenture', 'Novo BPO', 'SSC', 'inHouse'],
                      index=['Fluidez', '% Savings', 'Escalabilidade'])
    
    group_names = df.columns
    group_size = [100 / len(group_names)] * len(group_names)
    subgroup_names = ['A.1', 'A.2', 'A.3', 'B.1', 'B.2', 'B.3', 'C.1', 'C.2', 'C.3', 'D.1', 'D.2', 'D.3']
    
    # Make data: I have 4 groups and 12 subgroups - 3 for each group
    subgroup_size = []
    for group, size in zip(df.columns, group_size):
        subgroup_sum = df[group].sum()
        subgroup_size += [subgr / subgroup_sum * size for subgr in df[group]]
    
    # Create colors
    a, b, c, d = [plt.cm.Blues, plt.cm.Reds, plt.cm.Greens, plt.cm.Greys]
    
    # First Ring (outside)
    fig, ax = plt.subplots()
    ax.axis('equal')
    mypie, _ = ax.pie(group_size, radius=1.3, labels=group_names, colors=[a(0.6), b(0.6), c(0.6), d(0.6)])
    plt.setp(mypie, width=0.3, edgecolor='white')
    
    # Second Ring (Inside)
    mypie2, _ = ax.pie(subgroup_size, radius=1.3 - 0.3, labels=subgroup_names, labeldistance=0.7,
                       colors=[a(0.5), a(0.4), a(0.3), b(0.5), b(0.4), b(0.3), c(0.6), c(0.5), c(0.4), d(0.3), d(0.2),
                               d(0.4)])
    plt.setp(mypie2, width=0.4, edgecolor='white')
    plt.margins(0, 0)
    
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 2021-12-05
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      • 2016-08-13
      相关资源
      最近更新 更多