使用seaborn的barplot绘制宽格式数据框。

7

我正在尝试使用我的DataFrame中的所有观测值生成条形图,它看起来像这样:

import pandas as pd

data = {0: [52, 52, 52, 45, 0, 0],
        1: [49, 52, 52, 0, 0, 0],
        2: [48, 52, 52, 41, 0, 0]}

# (rows = years, columns = objects, values = violations of object in year)
cluster_yearly_results_df = pd.DataFrame(data)

    0   1   2
0  52  49  48
1  52  52  52
2  52  52  52
3  45   0  41
4   0   0   0
5   0   0   0

当使用默认的pandas plot时,我得到了正确类型的图表:

cluster_yearly_results_df.plot.bar()

enter image description here

然而,我想要使用seaborn,但是我在输入宽格式数据框时遇到了问题,使用:

sns.barplot(data=cluster_yearly_results_df)

我能用seaborn做我想做的事情吗?


如果你想要嵌套的条形图,你需要重新格式化为长格式。但是如果内置的pandas绘图可以满足你的需求,我建议你使用它。 - mwaskom
1个回答

9

seaborn.barplot的文档说:

条形图表示数值变量的中心趋势估计,每个矩形的高度提供了该估计的一些不确定性指示,使用误差线。

换句话说,目的是用单个条形图代表平均值,并使用标准差的误差线来表示一个变量的多个值。如果您要表示各个值,则可以使用pandas.DataFrame.plot.bar

话虽如此,您可以根据以下方法调整您的DataFrame以匹配seaborn接口。从类似于您的DataFrame开始:

df = pd.DataFrame(np.random.randint(low=0, high=10, size=(10, 3)), columns=list('ABC'))

   A  B  C
0  7  6  4
1  3  5  9
2  3  0  5
3  0  1  3
4  9  7  7

使用 .stack().reset_index() 创建两列,以唯一标识 y 中的每个值:
df = df.stack().reset_index()
df.columns = ['x', 'hue', 'y']

这将产生:

   x hue  y
0  0   A  6
1  0   B  1
2  0   C  2
3  1   A  5
4  1   B  7

然后绘制:

sns.barplot(y='y', x='x', hue='hue', data=df)

enter image description here


我希望这对你有所帮助? - Stefan
这真的很有帮助,非常感谢!我已经点赞了,但是由于我是新手,投票数不会显示出来。根据规则中的说明,应该避免发表感谢的评论。但是这正是我所需要的!对于回复晚了很抱歉,刚刚看到这条评论。 - Silviu Tofan
没关系。您应该能够接受答案,这样既可以让您的声誉增加,还可以将问题标记为已关闭,否则问题仍然会显示为未回答。 - Stefan
刚刚注意到投票下面的勾选框,谢谢! - Silviu Tofan
1
我无法理解的是为什么seaborn文档中说“输入数据可以以各种格式传递,包括:[...]一个'宽形式'的DataFrame,使得每个数字列都将被绘制。”,但显然这是不正确的,因为输入数据不能以宽形式的DataFrame传递,相反,应该先转换为长形式。我有什么遗漏吗? - magnum87

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接