在条形图中每个条的水平中间放置重要性星号

时间:2019-07-25 14:02:06

标签: python matplotlib seaborn

我写了一个叫做Chi2Independence的类。通过此类,您可以在两个分类变量之间执行Chi2独立性测试。该类还具有一种称为test_residuals的方法,在该方法中测试了标准化残差的重要性。最后,您可以使用方法plot可视化结果。通过在相应的条上方放置一个星号来指示类别的重要组合。但是,在当前版本中,星号不完全位于条形图的中间,而是向左稍微偏移一点。这是一个最小的示例,其中创建了一个虚拟数据框,然后使用我的绘图函数将其可视化:

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt

# create a the dataframe
chi2_df = pd.DataFrame({'survived':[0,0,0,1,1,1],
                        'class':['First','Second','Third','First','Second','Third'],
                        'Frequency':[80,97,372,136,87,119],
                        'sig':[True,True,True,True,True,True]})

# plot results
def plot(df_freq,x_var,hue_var,title,dst_dir=None):

    stdres_sig_sorted = df_freq.sort_values(hue_var)['sig']

    barplot = sns.barplot(x=x_var, y='Frequency', hue=hue_var,data=df_freq)
    barplot.set_xticklabels(barplot.get_xticklabels(), rotation=45)
    barplot.get_xticklabels()
    barplot.set_title(title)

    for p,sig in zip(barplot.patches,stdres_sig_sorted):

        if sig == True:
            barplot.annotate('*', (p.get_x() + p.get_width() / 2., p.get_height()),
                        ha='center', va='center', fontsize=11, color='gray', rotation=90, xytext=(0,10),
                        textcoords='offset points')

    plt.legend(loc='center left', bbox_to_anchor=(1.0, 0.5), ncol=1)

    plt.tight_layout()

plot(df_freq=chi2_df,x_var='class',hue_var='survived',title='Class | Survived')

这是输出条形图:

Barplot

有人知道如何解决此问题,以便将星号准确地放置在每个小节上方的水平中间位置吗?

1 个答案:

答案 0 :(得分:1)

我只需使用text来将星号以center水平对齐。绘制垂直线只是为了在视觉上仔细检查星号是否在中心。

for p, sig in zip(barplot.patches,stdres_sig_sorted):
    if sig == True:
        barplot.text(p.get_x() + p.get_width() / 2., p.get_height(), 
                     '*', ha='center')
        barplot.axvline(p.get_x() + p.get_width() / 2., lw=0.5)

enter image description here