python - 如何为每组熊猫列创建一个子图
问题描述
在 Titanic 数据集中,我需要创建一个图表来显示所有舱位幸存者的百分比。它还应该有三个饼图。1 级幸存和未幸存,2 级幸存和未幸存,3 级。
怎样才能做到这一点?我已经尝试过这种类型的代码,但它会产生错误的值。
import pandas as pd
import seaborn as sns # for dataset
df_titanic = sns.load_dataset('titanic')
survived pclass sex age sibsp parch fare embarked class who adult_male deck embark_town alive alone
0 0 3 male 22.0 1 0 7.2500 S Third man True NaN Southampton no False
1 1 1 female 38.0 1 0 71.2833 C First woman False C Cherbourg yes False
2 1 3 female 26.0 0 0 7.9250 S Third woman False NaN Southampton yes True
c1s = len(df_titanic[(df_titanic.pclass==1) & (df_titanic.survived==1)].value_counts())
c2ns = len(df_titanic[(df_titanic.pclass==1) & (df_titanic.survived==0)].value_counts())
此代码产生真实值,但我需要在 3 个饼图中
df_titanic.groupby(['pclass' ,'survived']).size().plot(kind='pie', autopct='%.2f')
等级:1,2,3 幸存者:0,1
解决方案
- 使用 pandas 获取子图的正确方法是重塑数据框。
pandas.crosstab
用于塑造数据框pandas.DataFrame.pivot
并且pandas.DataFrame.pivot_table
是用于重塑数据以进行绘图的其他选项。
pandas.DataFrame.plot
然后使用withkind='pie'
和绘图subplots=True
。
- 为格式化添加了额外的代码
- 旋转 pclass 标签
- 情节标题
- 自定义图例而不是每个子图的图例
- 指定图例的标签
- 为标签数量指定颜色
- 在
python 3.8.12
,pandas 1.3.4
,中测试matplotlib 3.4.3
import seaborn as sns # for titanic data only
import pandas as pd
from matplotlib.patches import Patch # to create the colored squares for the legend
# load the dataframe
df = sns.load_dataset('titanic')
# reshaping the dataframe is the most important step
ct = pd.crosstab(df.survived, df.pclass)
# display(ct)
pclass 1 2 3
survived
0 80 97 372
1 136 87 119
# plot and add labels
colors = ['tab:blue', 'tab:orange'] # specify the colors so they can be used in the legend
labels = ["not survived", "survived"] # used for the legend
axes = ct.plot(kind='pie', autopct='%.1f%%', subplots=True, figsize=(12, 5),
legend=False, labels=['', ''], colors=colors)
# flatten the array of axes
axes = axes.flat
# extract the figure object
fig = axes[0].get_figure()
# rotate the pclass label
for ax in axes:
yl = ax.get_ylabel()
ax.set_ylabel(yl, rotation=0, fontsize=12)
# create the legend
legend_elements = [Patch(fc=c, label=l) for c, l in zip(colors, labels)]
fig.legend(handles=legend_elements, loc=9, fontsize=12, ncol=2, borderaxespad=0, bbox_to_anchor=(0., 0.8, 1, .102), frameon=False)
fig.tight_layout()
fig.suptitle('pclass survival', fontsize=15)
格式化图
无格式图
axes = ct.plot(kind='pie', autopct='%.1f%%', subplots=True, figsize=(12, 5), labels=["not survived", "survived"])
推荐阅读
- ios - 如何运行一系列函数,如果其中一个执行,则返回
- java - 你能优化一个简单的for循环吗?- 爪哇
- javascript - JavaScript 中的 Increment Month 使用 setMonth() 删除 DATE 格式
- regex - 全名的正则表达式优化
- r - 根据存储在另一个列表中的索引访问列表中的多个元素
- typo3 - sys_categories FAL 图像编辑器
- sql - Yii2:尝试使用自定义 SQL 查询获取非对象的属性
- asp.net-mvc - 将文件保存到当前用户的路径桌面
- javascript - 使用 redux connect 的连接组件的子组件在一次 prop 更改后不会重新渲染
- python - django 在 UpdateView 中提交多个表单