我想使用以下数据生成以下堆积的条形图。
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
。
有人可以帮助我解决此问题吗?
答案 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()