【问题标题】:Is there an easy way to ensure that two pie plots of two pandas series with identical indexes plot in the same order?有没有一种简单的方法可以确保两个具有相同索引的熊猫系列的两个饼图以相同的顺序绘制?
【发布时间】:2019-10-22 04:09:42
【问题描述】:

我有两个熊猫系列。它们每个都有五个索引,范围(“非常低”、“低”、“中”、“高”、“非常高”)。该系列是通过将数据框分成两个人口统计数据然后获取值计数以编程方式创建的一个特定的列。

这两个系列是通过采用 pandas 数据框创建的,根据每一行是否由特定人口统计添加,然后提取一列上的值计数。

demog1, demog2 = (df[df.Demographic == 'demog'], df[df.Demographic != 'demog'])
save_pie_chart(demog1, 'Column Name', 'demog1.png')
save_pie_chart(demog2, 'Column Name', 'demog2.png')

当我从系列创建饼图时,每个饼图的索引都放置在不同的位置和不同的颜色。我想确保它们两次都具有相同的相对位置和相同的颜色。

我目前使用的方法是手动排序标签和数据,如下所示:

def save_pie_chart(df, col, path):
    series = df[col].value_counts()
    if 'Medium' in series.index:
        labels = []
        sizes = []
        for label in ['Very low', 'Low', 'Medium', 'High', 'Very high']:
            labels.append(label)
            sizes.append(series[label])
        series = sizes
    else:
        labels = series.keys()
    fig, ax = plt.subplots()
    ax.pie(series, labels=labels, autopct='%1.0f%%')
    ax.axis('equal')
    fig.savefig(path)

在上面,如果我在提取值计数后打印出series 变量,我会得到以下输出:

Low          15
Very high    14
Very low     11
Medium       11
High         10
Name: Column Name, dtype: int64
High         95
Low          89
Medium       85
Very low     85
Very high    85
Name: Column Name, dtype: int64

是否有一种内置方式让我告诉 matplotlib,“我想要按此顺序排列的标签”并将标签传递给它?

【问题讨论】:

  • 你能发布一个完整的例子吗? IE。使用一些与您的格式相同的虚拟数据,以便我们可以在我们端生成数字进行测试?
  • 我编辑了问题以包含更多信息,因此您可以了解该系列是如何构建的,并且我包含了打印系列的结果。我通过手动循环解决了这个问题按我想要的顺序排列标签,我只是希望 matplotlib 有一些方法来指定饼图楔形的顺序。

标签: python pandas matplotlib


【解决方案1】:

您可以使用value_counts(sort=False)df.plot.bar

axes = (df.groupby('Demographic')['Medium'].value_counts()
   .unstack('Demographic')
   .plot.pie(subplots=True, autopct='%1.0f%%')
)

for ax in axes: ax.get_legend().remove()

输出:

【讨论】:

    猜你喜欢
    • 2020-11-27
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    相关资源
    最近更新 更多