【问题标题】:Nested pie chart from dataframe来自数据框的嵌套饼图
【发布时间】:2020-11-11 22:57:57
【问题描述】:

我有一个这样的数据框 df:

product   count  Class
stuff       3      A
thing       7      A
another     1      B

我可以用我的代码制作 2 个不同的饼图:

my_data = df['count']
my_labels = df['Product']
plt.pie(my_data,labels=my_labels,autopct='%1.1f%%')
plt.title('Distribution 1')
plt.axis('equal')
plt.show()

my_data = df['count']
my_labels = df['Class']
plt.pie(my_data,labels=my_labels,autopct='%1.1f%%')
plt.title('Distribution 2')
plt.axis('equal')
plt.show()

但我想做一个可以结合两者的嵌套馅饼:

当我检查https://matplotlib.org/3.1.1/gallery/pie_and_polar_charts/nested_pie.html 我不明白如何不使用静态值。

【问题讨论】:

    标签: python pandas pie-chart


    【解决方案1】:

    我会根据您共享的链接更紧密地编写您的代码。只需将示例中的数组替换为您的列即可。您可能需要对标签进行一些额外的格式化,但您的实际数据可能还可以:

    import matplotlib.pyplot as plt
    df = d1.copy()
    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(df.groupby('Class', sort=False)['count'].sum(), radius=1, colors=outer_colors, labels=df['Class'].drop_duplicates(), autopct='%1.1f%%',
           wedgeprops=dict(width=size, edgecolor='w'))
    
    ax.pie(df['count'], radius=1-size, colors=inner_colors, labels=df['product'], autopct='%1.1f%%',
           wedgeprops=dict(width=size, edgecolor='w'))
    
    ax.set(aspect="equal", title='Distribution 1 and 2')
    plt.show()
    

    【讨论】:

    • 也许还有一个问题,有没有办法合并外侧的 2 个“A”部分?这是我图的主要目的。
    • @marou95thebest 我不太清楚你的意思。
    • 标签的长度需要与列的长度相匹配,这就是为什么我在第一个图中使用unique() 来匹配 groupby 输出的长度。 IE。两者都必须有两个值。
    • @marou95thebest 好地方,我知道为什么会这样,我会更新我的答案。为了确保排序不会搞砸,我使用了:df.groupby('Class', sort=False)。另外,我已经为标签完成了df['Class'].drop_duplicates(),所以应该没有问题和不排队的问题。
    • 嗯...我不确定是什么问题。是否可以使用一些示例数据发布一个新问题来显示它是如何出错的?当前的示例数据没有显示任何问题。
    【解决方案2】:

    与教程类似,您可能需要稍微修改一下:

    大小 = 0.3

    fig, ax = plt.subplots()
    
    ax.pie(df.groupby('Class')['count'].sum(), radius=1, 
           wedgeprops=dict(width=size, edgecolor='w'))
    
    ax.pie(df['count'], radius=1-size, 
           wedgeprops=dict(width=size, edgecolor='w'))
    
    ax.set(aspect="equal", title='Pie plot with `ax.pie`')
    

    输出:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 2022-07-14
      • 2018-06-12
      • 2016-11-13
      • 2021-02-15
      • 2017-06-16
      相关资源
      最近更新 更多