matplotlib 海运:按组划分的 Dataframe 条形图

7gyucuyw  于 2022-12-13  发布在  其他
关注(0)|答案(2)|浏览(143)

我在这方面遇到了困难。我有我的初始模型('Unfiltered)的结果,我画成这样:

df = pd.DataFrame(
    {'class': ['foot', 'bike', 'bus', 'car', 'metro'],
     'Precision': [0.7, 0.66, 0.41, 0.61, 0.11],
     'Recall': [0.58, 0.35, 0.13, 0.89, 0.02],
     'F1-score': [0.64, 0.45, 0.2, 0.72, 0.04]}
)

groups = df.melt(id_vars=['class'], var_name=['Metric'])
sns.barplot(data=groups, x='class', y='value', hue='Metric')

为了产生这个漂亮的情节:

现在,我从改进的模型(filtered)中获得了第二个结果,因此我在df中添加了一列(status),以指示每个模型的结果,如下所示:

df2 = pd.DataFrame(
    {'class': ['foot','foot','bike','bike','bus','bus',
               'car','car','metro','metro'],
 'Precison': [0.7, 0.62, 0.66, 0.96, 0.41, 0.42, 0.61, 0.75, 0.11, 0.3],
 'Recall': [0.58, 0.93, 0.35, 0.4, 0.13, 0.1, 0.89, 0.86, 0.02, 0.01],
 'F1-score': [0.64, 0.74, 0.45, 0.56, 0.2, 0.17, 0.72, 0.8, 0.04, 0.01],
 'status': ['Unfiltered', 'Filtered', 'Unfiltered','Filtered','Unfiltered',
           'Filtered','Unfiltered','Filtered','Unfiltered','Filtered']}
)

df2.head()
    class  Precison  Recall  F1-score   status
0   foot    0.70      0.58    0.64     Unfiltered
1   foot    0.62      0.93    0.74     Filtered
2   bike    0.66      0.35    0.45     Unfiltered
3   bike    0.96      0.40    0.56     Filtered
4   bus     0.41      0.13    0.20     Unfiltered

我想把这个画出来,和上面的分组类似(即footbikebuscarmetro)。但是,对于每个指标,我希望将两个值并排放置。以foot组为例,我将有两个条形Precision[Unfiltered, filtered],然后对于Recall[Unfiltered, filtered]为2个柱,对于F1-score[Unfiltered, filtered]也为2个柱。
我的尝试:

group2 = df2.melt(id_vars=['class', 'status'], var_name=['Metric'])
sns.barplot(data=group2, x='class', y='value', hue='Metric')

完全不是我想要的。

wwtsj6pe

wwtsj6pe1#

你可以在hue中传递任何序列,只要它与你的数据长度相同,并通过它分配颜色。

group2 = df2.melt(id_vars=['class', 'status'], var_name=['Metric'])
sns.barplot(data=group2, x='class', y='value', hue=group2[['Metric','status']].agg(tuple, axis=1))
plt.legend(fontsize=7)

但结果有点难以解读:

yyyllmsg

yyyllmsg2#

海运分组条形图不允许多个分组变量。一种解决方法是将两个分组变量(指标和状态)重新编码为一个具有6个水平的变量。另一种可能性是使用面。如果您使用其他绘图包,我可能会推荐plotnine,它允许多个分组变量,如下所示:

import plotnine as p9

fig = (
    p9.ggplot(group2)
    + p9.geom_col(
        p9.aes(x="class", y="value", fill="Metric", color="Metric", alpha="status"),
        position=p9.position_dodge(1),
        size=1,
        width=0.5,
    )
    + p9.scale_color_manual(("red", "blue", "green"))
    + p9.scale_fill_manual(("red", "blue", "green"))
)

fig.draw()

这将生成以下图像:

相关问题