我在这方面遇到了困难。我有我的初始模型('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
我想把这个画出来,和上面的分组类似(即foot
、bike
、bus
、car
、metro
)。但是,对于每个指标,我希望将两个值并排放置。以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')
完全不是我想要的。
2条答案
按热度按时间wwtsj6pe1#
你可以在
hue
中传递任何序列,只要它与你的数据长度相同,并通过它分配颜色。但结果有点难以解读:
yyyllmsg2#
海运分组条形图不允许多个分组变量。一种解决方法是将两个分组变量(指标和状态)重新编码为一个具有6个水平的变量。另一种可能性是使用面。如果您使用其他绘图包,我可能会推荐plotnine,它允许多个分组变量,如下所示:
这将生成以下图像: