与Seaborn.FacetGrid一起使用自定义函数,并收到错误消息“ ValueError:石斑鱼和轴的长度必须相同”

时间:2020-06-15 03:34:47

标签: pandas matplotlib seaborn

我想使用以下数据生成以下堆积的条形图。

enter image description here

   data = [[1, '(0, 10]', 'male', 2.0],
   [1, '(0, 10]', 'female', 2.0],
   [1, '(10, 20]', 'male', 2.0],
   [1, '(10, 20]', 'female', 15.0],
   [1, '(20, 30]', 'male', 9.0],
   [1, '(20, 30]', 'female', 29.0],
   [1, '(30, 40]', 'male', 13.0],
   [1, '(30, 40]', 'female', 37.0],
   [1, '(40, 50]', 'male', 9.0],
   [1, '(40, 50]', 'female', 21.0],
   [1, '(50, 60]', 'male', 4.0],
   [1, '(50, 60]', 'female', 15.0],
   [1, '(60, 70]', 'male', 0.0],
   [1, '(60, 70]', 'female', 2.0],
   [2, '(0, 10]', 'male', 9.0],
   [2, '(0, 10]', 'female', 17.0],
   [2, '(10, 20]', 'male', 1.0],
   [2, '(10, 20]', 'female', 9.0],
   [2, '(20, 30]', 'male', 0.0],
   [2, '(20, 30]', 'female', 25.0],
   [2, '(30, 40]', 'male', 3.0],
   [2, '(30, 40]', 'female', 19.0],
   [2, '(40, 50]', 'male', 1.0],
   [2, '(40, 50]', 'female', 10.0],
   [2, '(50, 60]', 'male', 0.0],
   [2, '(50, 60]', 'female', 2.0],
   [2, '(60, 70]', 'male', 1.0],
   [2, '(60, 70]', 'female', 0.0],
   [3, '(0, 10]', 'male', 8.0],
   [3, '(0, 10]', 'female', 19.0],
   [3, '(10, 20]', 'male', 7.0],
   [3, '(10, 20]', 'female', 20.0],
   [3, '(20, 30]', 'male', 14.0],
   [3, '(20, 30]', 'female', 30.0],
   [3, '(30, 40]', 'male', 7.0],
   [3, '(30, 40]', 'female', 13.0],
   [3, '(40, 50]', 'male', 2.0],
   [3, '(40, 50]', 'female', 2.0],
   [3, '(50, 60]', 'male', 0.0],
   [3, '(50, 60]', 'female', 0.0],
   [3, '(60, 70]', 'male', 0.0],
   [3, '(60, 70]', 'female', 1.0]]
   df = pd.DataFrame(data, columns=['Pclass', 'Age', 'Sex', 'Survived'])

我尝试将Seaborn.FacetGrid与以下定义的自定义函数一起使用:

   def sbp(*args, **kwargs):
       data = kwargs.pop('data')
       sns.barplot(x = data.Age, y = data.loc[data.Sex == 'female', 'Survived'], color = 'red')
       sns.barplot(x = data.Age, y = data.loc[data.Sex == 'male', 'Survived'], color = 'blue') 
   g = sns.FacetGrid(df, col='Pclass', margin_titles=True)
   g = g.map_dataframe(sbp, Age='Age', Sex='Sex')
   plt.show()

我得到了以下错误消息:ValueError: Length of grouper (14) and axis (5) must be the same length

有人可以帮助我解决此问题吗?

1 个答案:

答案 0 :(得分:0)

@Andrea Blengino感谢您的确认。这是我最终获得的修饰版本。

def sbp(*args, **kwargs):
    data = kwargs.pop('data')
    sns.barplot(x = data.Age, y = data.loc[data.Sex == 'female', 'Survived'], color = 'red', label = 'femal')
    sns.barplot(x = data.Age, y = data.loc[data.Sex == 'male', 'Survived'], color = 'blue', label = 'male') 
g = sns.FacetGrid(df, col='Pclass', margin_titles=True, legend_out=True)
g = g.map_dataframe(sbp, Age='Age', Sex='Sex')
for i, ax in enumerate(g.axes.flat):
    labels = ax.get_xticklabels() # get x labels
    ylabel = ax.yaxis.get_label()
    ax.set_xlabel('Age')
    if i==0: ax.set_ylabel('Survivor count')
    ax.set_xticklabels(labels, rotation=90)
g.add_legend()    
plt.show()

enter image description here