Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在条形图中每个条形图的水平中间放置重要星号_Python_Matplotlib_Seaborn - Fatal编程技术网

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

Python 在条形图中每个条形图的水平中间放置重要星号,python,matplotlib,seaborn,Python,Matplotlib,Seaborn,我编写了一个名为Chi2Independence的类。使用这个类,您可以执行两个分类变量之间的独立性的Chi2测试。该类还有一种称为test_residuals的方法,其中标准化残差进行显著性测试。最后,您可以使用方法plot将结果可视化。类别的重要组合将通过在相应栏上方放置星号来表示。然而,在当前版本中,星号并不完全在杆的中间,而是稍微向左移动。下面是一个最小的示例,其中创建了一个虚拟数据框,然后使用“我的绘图”函数进行可视化: import seaborn as sns import pan

我编写了一个名为
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')
这是输出条形图:


有人知道如何解决这个问题,使星号准确地放置在每个条上方的水平中间位置吗?

我只需使用
文本
将星号与
中心
水平对齐即可。绘制垂直线只是为了目视检查星号是否在中心

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)