gpt4 book ai didi

python - 如何为每组 pandas 列创建一个子图

转载 作者:行者123 更新时间:2023-12-05 01:56:24 25 4
gpt4 key购买 nike

在泰坦尼克号数据集中,我需要创建一个图表来显示所有舱位幸存乘客的百分比。它还应该有三个饼图。第 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')

enter image description here

类:1,2,3 幸存:0,1

最佳答案

  1. 使用 pandas 获取子图的正确方法是 reshape 数据框。 pandas.crosstab用于塑造数据框
  2. 然后使用 pandas.DataFrame.plot 绘图使用 kind='pie'subplots=True
  • 已添加用于格式化的额外代码
    • 旋转 pclass 标签
    • 情节标题
    • 自定义图例而不是每个子图的图例
      • 为图例指定标签
      • 为标签数量指定颜色
  • python 3.8.12pandas 1.3.4matplotlib 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)

格式化图

enter image description here

无格式图

axes = ct.plot(kind='pie', autopct='%.1f%%', subplots=True, figsize=(12, 5), labels=["not survived", "survived"])

enter image description here

关于python - 如何为每组 pandas 列创建一个子图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69865648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com