为了账号安全,请及时绑定邮箱和手机立即绑定

如何向 matplotlib/seaborn 条形图添加第二个轴并使辅助点与正确的条形对齐?

如何向 matplotlib/seaborn 条形图添加第二个轴并使辅助点与正确的条形对齐?

明月笑刀无情 2023-08-22 10:48:35
我写了一个(新手)python 函数(如下)来绘制一个按主要维度和可能的次要维度划分的条形图。例如,下图显示了每种性别中获得特定教育水平的人数百分比。问题:如何在每个条形上叠加该子组的家庭规模中位数,例如在大学/女性条形上放置一个表示值“3”的点。我见过的例子都没有准确地将点覆盖在正确的栏上。我对此非常陌生,所以非常感谢您的帮助!df = pd.DataFrame({'Student'       : ['Alice', 'Bob', 'Chris',  'Dave',    'Edna',    'Frank'],                    'Education'     : ['HS',    'HS',  'HS',     'College', 'College', 'HS'   ],                   'Household Size': [4,        4,     3,        3,         3,         6     ],                   'Gender'        : ['F',     'M',   'M',      'M',       'F',       'M'    ]});def MakePercentageFrequencyTable(dataFrame, primaryDimension, secondaryDimension=None, extraAggregatedField=None):    lod = dataFrame.groupby([secondaryDimension]) if secondaryDimension is not None else dataFrame    primaryDimensionPercent = lod[primaryDimension].value_counts(normalize=True) \                         .rename('percentage') \                         .mul(100) \                         .reset_index(drop=False);    if secondaryDimension is not None:        primaryDimensionPercent = primaryDimensionPercent.sort_values(secondaryDimension)        g = sns.catplot(x="percentage", y=secondaryDimension, hue=primaryDimension, kind='bar', data=primaryDimensionPercent)    else:        sns.catplot(x="percentage", y='index', kind='bar', data=primaryDimensionPercent)        MakePercentageFrequencyTable(dataFrame=df,primaryDimension='Education', secondaryDimension='Gender')# Question: I want to send in extraAggregatedField='Household Size' when I call the function such that # it creates a secondary 'Household Size' axis at the top of the figure# and aggregates/integrates the 'Household Size' column such that the following points are plotted# against the secondary axis and positioned over the given bars:## Female/College => 3# Female/High School => 4# Male/College => 3# Male/High School => 4到目前为止我所取得的成就的图片
查看完整描述

1 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

您将必须使用轴级函数sns.barplot()和sns.stripplot()而不是catplot(),它会创建一个新图形和FacetGrid。


像这样的东西:


df = pd.DataFrame({'Student'       : ['Alice', 'Bob', 'Chris',  'Dave',    'Edna',    'Frank'], 

                   'Education'     : ['HS',    'HS',  'HS',     'College', 'College', 'HS'   ],

                   'Household Size': [4,        4,     3,        3,         3,         6     ],

                   'Gender'        : ['F',     'M',   'M',      'M',       'F',       'M'    ]});



def MakePercentageFrequencyTable(dataFrame, primaryDimension, secondaryDimension=None, extraAggregatedField=None, ax=None):

    ax = plt.gca() if ax is None else ax

    lod = dataFrame.groupby([secondaryDimension]) if secondaryDimension is not None else dataFrame


    primaryDimensionPercent = lod[primaryDimension].value_counts(normalize=True) \

                         .rename('percentage') \

                         .mul(100) \

                         .reset_index(drop=False);


    if secondaryDimension is not None:

        primaryDimensionPercent = primaryDimensionPercent.sort_values(secondaryDimension)

        ax = sns.barplot(x="percentage", y=secondaryDimension, hue=primaryDimension, data=primaryDimensionPercent, ax=ax)

    else:

        ax = sns.barplot(x="percentage", y='index', data=primaryDimensionPercent, ax=ax)

    

    if extraAggregatedField is not None:

        ax2 = ax.twiny()

        extraDimension = dataFrame.groupby([primaryDimension, secondaryDimension]).mean().reset_index(drop=False)

        ax2 = sns.stripplot(data=extraDimension, x=extraAggregatedField, y=secondaryDimension, hue=primaryDimension, 

                            ax=ax2,dodge=True, edgecolors='k', linewidth=1, size=10)



plt.figure()

MakePercentageFrequencyTable(dataFrame=df,primaryDimension='Education', secondaryDimension='Gender', extraAggregatedField='Household Size')

https://img1.sycdn.imooc.com//64e422550001ac5f06410477.jpg

查看完整回答
反对 回复 2023-08-22
  • 1 回答
  • 0 关注
  • 3819 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信