matplotlib 如何创建按类别颜色编码的堆叠条形图

sd2nnvve  于 2023-05-29  发布在  其他
关注(0)|答案(3)|浏览(178)

我正在Kaggle上处理一个流行的泰坦尼克号数据集,我想创建一个条形图,显示幸存者与死亡人数的对比。死亡的性别在x轴上,我想要性别(男性/女性)。我想把幸存者和死者用颜色分类。
下面是我当前的代码,它为男性/幸存者,男性/死亡者,女性/幸存者,女性/死亡者的每个组合生成四个条形图:

import pandas as pd
import seaborn as sns  # for the data

df = sns.load_dataset('titanic').loc[:, ['sex', 'survived']]
df.groupby('sex').survived.value_counts().plot(kind='bar', color=['C0', 'C1'], stacked=True)

当前输出

0h4hbjxa

0h4hbjxa1#

  • 最简单的方法是使用pandas.DataFrame.pivot_table重新塑造DataFrame,然后使用指定kind='bar'stacked=Truepandas.DataFrame.plot绘图。
  • 需要记住的重要一点是将数据转换为绘图API的正确格式。
  • 如果需要聚合值,则使用.pivot_table,否则使用.pivot
  • 使用pandas v1.2.4matplotlib v3.3.4matplotlibpandas作为依赖项导入)。
import seaborn as sns  # used for the titanic data
import pandas as pd

# load the two necessary column
df = sns.load_dataset('titanic').loc[:, ['sex', 'survived']]

# create a pivot table
dfp = df.pivot_table(index='sex', columns=['survived'], aggfunc=len)

# display(dfp)
survived    0    1
sex               
female     81  233
male      468  109

# plot the dataframe
dfp.plot(kind='bar', stacked=True, ylabel='Counts', xlabel='Gender',
         title='Survival Status Count by Gender', rot=0)

  • 我不推荐堆叠的条形图,因为区分和比较每个类别的值更加困难。
dfp.plot(kind='bar', stacked=False, ylabel='Counts', xlabel='Gender',
         title='Survival Status Count by Gender', rot=0)

sqserrrh

sqserrrh2#

通过一些示例数据,我相信这就是你正在寻找的,使用matplotlib

import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({'Sex':['M','F','M','F','M','F','M','F','M','F','F','F','M','F','F','F'],
                   'Survived':['Y','Y','N','Y','N','Y','N','Y','Y','Y','Y','Y','Y','Y','N','N']})
grouped = df.groupby(['Sex','Survived'],as_index=False).agg(Count=pd.NamedAgg(column="Survived", aggfunc="count"))
fig, ax = plt.subplots()
ax.bar(grouped[grouped['Sex'] =='F']['Survived'], grouped[grouped['Sex']=='F']['Count'],label='F')
ax.bar(grouped[grouped['Sex'] =='M']['Survived'], grouped[grouped['Sex']=='M']['Count'],label='M',bottom=grouped[grouped['Sex']=='F']['Count'])
ax.set_ylabel("Number of passengers")
ax.set_xlabel("Survived status")
ax.set_title('Passengers by survivality and gender')
ax.legend()
plt.show()

这是输出:

bkhjykvo

bkhjykvo3#

对于这种复杂的图,尤其是DataFrames,我更喜欢使用plotly,因为输出更具交互性。我没有使用组操作,因为逻辑索引可以完成这个任务。
最后,由于堆叠直方图的性质,您只能表示死者,因为幸存者将是左侧区域。如果你想用不同的颜色来表示它们,请随意发表评论。
希望它能解决你的问题!

import plotly.graph_objects as go
import numpy as np
import seaborn as sns

df = sns.load_dataset('titanic').loc[:, ['sex', 'survived']]
male_df = df[df['sex'] == 'male']
female_df = df[df['sex'] == 'female']

fig = go.Figure(go.Histogram(
    x=df['sex'], bingroup=1, name='total number of male/female'
))
fig.add_trace(go.Histogram(
    x=male_df[male_df['survived'] == 0]['sex'], bingroup=1, name='number of deceased male'
))
fig.add_trace(go.Histogram(
    x=female_df[female_df['survived'] == 0]['sex'], bingroup=1, name='number of deceased female'
))
fig.update_layout(
    title='Passengers by survivality and gender',
    barmode='overlay',
    bargap=0.1
)
fig.show()

相关问题