柱状图中X轴与柱子不正确对齐(seaborn)

3

我的图表最终看起来像这样:

enter image description here

我使用了原始的泰坦尼克号数据集,切分了一些列,并通过以下代码创建了一个新的数据框。

Cabin_group = titanic[['Fare', 'Cabin', 'Survived']] #selecting certain columns from dataframe
Cabin_group.Cabin = Cabin_group.Cabin.str[0] #cleaning the Cabin column
Cabin_group = Cabin_group.groupby('Cabin', as_index =False).Survived.mean()
Cabin_group.drop([6,7], inplace = True) #drop Cabin G and T as instances are too low
Cabin_group['Status']= ('Poor', 'Rich', 'Rich', 'Medium', 'Medium', 'Poor') #giving each Cabin a status value.

所以我的新数据框`Cabin_group'最终看起来像这样:

  Cabin  Survived  Status
0     A  0.454545    Poor
1     B  0.676923    Rich
2     C  0.574468    Rich
3     D  0.652174  Medium
4     E  0.682927  Medium
5     F  0.523810    Poor

我试图绘制这个数据框,方法如下:

fig = plt.subplots(1,1, figsize = (10,4))
sns.barplot(x ='Cabin', y='Survived', hue ='Status', data = Cabin_group )
plt.show()

这个图表有几个问题;首先,柱形图A、D、E和F与它们各自的x轴标签不对齐。其次,柱形本身似乎比我通常使用的柱形图更窄。

不知道如何将柱子移动到正确的位置,以及如何控制柱子的宽度。

谢谢。


1
当您传递 hue='Status' 时,seaborn会添加足够的空间来容纳每个x位置上'Status'的每个唯一值的条形图。数据不足以填充所有内容的事实表明这可能不是最佳方法。 - Paul H
4
在0.8.dev版本中,当hue变量未嵌套在x变量内时,您可以使用dodge=False - mwaskom
谢谢,我会测试0.8 dev版本。 - Moondra
因为重复的问题中被接受的答案比这里最多赞同的答案要旧,而且答案是相同的,所以被标记为重复。 - Trenton McKinney
因为重复问题的被接受的答案比这里最多赞同的答案要旧,并且两个答案是相同的,所以将此问题标记为重复。 - Trenton McKinney
2个回答

10
这可以通过设置dodge=False实现。在seaborn的新版本中已经处理好了。

3

由于每个 x(即每个不同的 Status 值)需要 3 个条形图,但只提供了一个,因此这些条形图未对齐。我认为解决方案之一是将颜色映射到 Status 上。据我所知,这并不容易实现。然而,以下是如何实现的示例。我不确定这是否可行,因为将颜色映射到类别似乎很复杂(而且图例没有显示)。

# Creating a color mapping
Cabin_group['Color'] = Series(pd.factorize(Cabin_group['Status'])[0]).map(
                              lambda x: sns.color_palette()[x])

g = sns.barplot(x ='Cabin', y='Survived', data=Cabin_group, palette=Cabin_group['Color'])

图片描述在这里

当我看到R中有多么简单的时候......但不幸的是,Python中的ggplot实现不允许使用stat = 'identity'绘制geom_bar

library(tidyverse)

Cabin_group %>% ggplot() +
  geom_bar(aes(x = Cabin, y= Survived, fill = Status), 
           stat = 'identity')

enter image description here


谢谢您的回答。我不熟悉因式分解,所以我会尝试使用您的代码并查看是否有一种简单的方法来输出图例。 - Moondra
嗨,Romain。我不太理解 pd.factorize(Cabin_group['Status'])[0] 中的 [0] 的意义。 - Moondra
你好,我已经使用了 factorize 函数将每个 Status 转换为数字值。该函数返回一个元组,我使用 [0] 获取第一个项目,即转换后的值 [0, 1, 1, 2, 2, 0](第二个是唯一原始值的索引)。为了更好地理解,我应该使用 Cabin_group['Status'].map({'Poor': 0, 'Medium': 1, 'Rich': 2})。但是正如我所说,我远非确定这是输出此图形的最佳方法。 - Romain
谢谢。看起来在新的Seaborn更新中,这个问题将得到解决。 - Moondra
在Seaborn 0.9.0中,使用选项dodge=False来避免偏移。 - quant_dev

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