如何使用三列三行的三个数据框创建堆叠的条形图

时间:2018-07-13 02:24:17

标签: python pandas matplotlib

我有三个数据框df_Male , df_female , Df_TransGender

示例数据帧df_Male

continent   avg_count_country   avg_age
  Asia          55                5
  Africa        65                10
  Europe        75                8

df_Female

continent   avg_count_country   avg_age
  Asia          50                7
  Africa        60                12
  Europe        70                0

df_Transgender

continent   avg_count_country   avg_age
  Asia          30                6
  Africa        40                11
  America       80                10

现在我们堆积的条形图应该看起来像

X轴将包含三个刻度线,男性,女性,变性者

Y轴将为Total_count--100

在栏中,avg_age将被堆叠

现在我正尝试使用数据透视表

pivot_df = df.pivot(index='new_Columns', columns='avg_age ', values='Values')

对于如何绘制此图感到困惑,任何人都可以帮助将三个数据帧合并为一个,以便它创建Male,Female和Transgener列

1 个答案:

答案 0 :(得分:1)

此主题在此处处理:https://pandas.pydata.org/pandas-docs/stable/merging.html

(请注意,df_Transgender中的第三大洲与其他数据框“美国”而不是“欧洲”不同;我在下图中更改了它,希望这是正确的。)

frames = [df_Male, df_Female, df_Transgender]
df = pd.concat(frames, keys=['Male', 'Female', 'Transgender'])

              continent  avg_count_country  avg_age
Male        0      Asia                 55        5
            1    Africa                 65       10
            2    Europe                 75        8
Female      0      Asia                 50        7
            1    Africa                 60       12
            2    Europe                 70        0
Transgender 0      Asia                 30        6
            1    Africa                 40       11
            2    Europe                 80       10

btm = [0, 0, 0]
for name, grp in df.groupby('continent', sort=False):
    plt.bar(grp.index.levels[1], grp.avg_age.values, bottom=btm, tick_label=grp.index.levels[0], label=name)
    btm = grp.avg_age.values
plt.legend(ncol = 3)

enter image description here

正如您在下面评论的那样,第三个数据集中的America没错,您可以像上面那样继续向每个数据帧添加行,就像上面一样:

df_Male.append({'avg_age': 0, 'continent': 'America'}, ignore_index=True)
df_Female.append({'avg_age': 0, 'continent': 'America'}, ignore_index=True)
df_Transgender.append({'avg_age': 0, 'continent': 'Europe'}, ignore_index=True)