这是我用很长的代码制作的。
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()
这是代码中的交叉表。
这就是除法之后的看法。
但是我必须在我的代码中进行2次,因为我需要一个Survived = 0和一个Survived = 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()
抱歉,没有数据框就无法运行。根据我的经验,保持代码更像以前的代码实际上更好。即使它更长,也可以在以后需要调整时更容易;如果你想要两个图中的差异,一切都是明确的,可以很容易地改变。