如何在Python中制作100%堆积面积的facetgrid?

时间:2017-09-21 01:26:42

标签: python matplotlib data-visualization seaborn

这是我用很长的代码制作的。

enter image description here

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=[7,2], sharex=True, sharey=True)

ddf_Pclass_Sex0 = pd.crosstab(titanic_df[titanic_df.Survived == 0].Pclass, titanic_df[titanic_df.Survived == 0].Sex)
ddf_Pclass_Sex0.divide(ddf_Pclass_Sex0.sum(axis=1), axis=0).plot.area(stacked=True, ax=ax1, color=['#55A868', '#4C72B0'])
ax1.set_title('Survived = 0', fontsize=9.5)
ax1.legend('')
ax1.set_xlabel('')
ax1.set_ylabel('Percent (%)')

ddf_Pclass_Sex1 = pd.crosstab(titanic_df[titanic_df.Survived == 1].Pclass, titanic_df[titanic_df.Survived == 1].Sex)
ddf_Pclass_Sex1.divide(ddf_Pclass_Sex1.sum(axis=1), axis=0).plot.area(stacked=True, ax=ax2, color=['#55A868', '#4C72B0'])
ax2.set_title('Survived = 1', fontsize=9.5)
ax2.set_xlabel('')

leg = ax2.legend(fontsize='small', loc='center left', bbox_to_anchor=(1, 0.5))
leg.set_title('Sex', prop={'size':'small'})

fig.suptitle('Sex Composition in Percentage by Ticket Class', fontsize=9.5, y=1.06)
fig.text(.5, -.05, 'Ticket Class', ha='center', fontsize=9.5)

ax1.set_xticks(np.arange(1, 4, 1))

plt.show()

enter image description here

这是代码中的交叉表。

enter image description here

这就是除法之后的看法。

但是我必须在我的代码中进行2次,因为我需要一个Survived = 0和一个Survived = 1的图。

如何使用更短的代码来实现相同的效果?我觉得制作子图非常愚蠢,并逐一绘制和定制它们。

1 个答案:

答案 0 :(得分:0)

您可以将轴设置为列表,使用list comprehension设置ddf_Pclass_Sex数组,然后循环它们(以减少对xlabel,xticks和set title的重复调用)。否则我认为你需要打电话给其他所有人,

fig, axs = plt.subplots(1, 2, figsize=[7,2], sharex=True, sharey=True)
ddf_Pclass_Sex = [pd.crosstab(titanic_df[titanic_df.Survived == i].Pclass, 
                              titanic_df[titanic_df.Survived == i].Sex) for i in range(2)]

for i, d, axs in enumerate(zip(ddf_Pclass_Sex, axs)):
    d.divide(d.sum(axis=1), axis=0).plot.area(stacked=True, 
                                              ax=ax, 
                                              color=['#55A868', '#4C72B0'])
    ax.set_title('Survived = ' + str(i), fontsize=9.5)
    ax.set_xlabel('')
    ax.set_xticks(np.arange(1, 4, 1))

ax[0].set_ylabel('Percent (%)')
leg = axs[1].legend(fontsize='small', loc='center left', bbox_to_anchor=(1, 0.5))
leg.set_title('Sex', prop={'size':'small'})
fig.suptitle('Sex Composition in Percentage by Ticket Class', 
             fontsize=9.5, y=1.06)
fig.text(.5, -.05, 'Ticket Class', ha='center', fontsize=9.5)
plt.show()

抱歉,没有数据框就无法运行。根据我的经验,保持代码更像以前的代码实际上更好。即使它更长,也可以在以后需要调整时更容易;如果你想要两个图中的差异,一切都是明确的,可以很容易地改变。