ax.annotate文本部分出现在图形框之外

问题描述

道歉,对编程和stackoverflow也不太熟练。我在一些数据上绘制条形图,并使用ax.annotate设法在条形旁添加百分比。但是,对于响应最高的条形图,我总是在图框之外得到百分比数字的一部分,如下图所示。尝试过不同的想法,但没有一个解决此问题。寻找有关如何解决此问题的建议。

enter image description here

这是我的代码

from matplotlib import pyplot as plt
import seaborn as sns

def plot_barplot(df):
    plt.rcParams.update({'font.size': 18})
    sns.set(font_scale=2)
    if (len(df) > 1):
        fig = plt.figure(figsize=(12,10))
        ax = sns.barplot(x='count',y=df.columns[0],data=df,color='blue')
       
    else:
        fig = plt.figure(figsize=(5,7))
        ax = sns.barplot(x=df.columns[0],y='count',color='blue')
    fig.set_tight_layout(True)
    
    
    plt.rcParams.update({'font.size': 14})
    total = df['count'].sum()
    
    
    for p in ax.patches:
        percentage ='{:.2f}%'.format(100 * p.get_width()/total)
        
        print(percentage)
        x = p.get_x() + p.get_width() + 0.02
        y = p.get_y() + p.get_height()/2
        ax.annotate(percentage,(x,y))

数据框看起来像这样

enter image description here

解决方法

我建议您增加the axes' margins(在这种情况下,沿x方向)。那就是您的最大数据量与轴上的最大比例量之间的空间。您将不得不根据自己的需要来尝试使用该值,但是看起来值0.1或0.2应该足够。

添加:

plt.rcParams.update({'axes.xmargin': 0.2})

功能顶部

enter image description here

完整代码:

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


def plot_barplot(df):
    plt.rcParams.update({'font.size': 18})
    plt.rcParams.update({'axes.xmargin': 0.1})

    sns.set(font_scale=2)
    if (len(df) > 1):
        fig = plt.figure(figsize=(12,10))
        ax = sns.barplot(x='count',y=df.columns[0],data=df,color='blue')

    else:
        fig = plt.figure(figsize=(5,7))
        ax = sns.barplot(x=df.columns[0],y='count',color='blue')
    fig.set_tight_layout(True)

    plt.rcParams.update({'font.size': 14})
    total = df['count'].sum()

    for p in ax.patches:
        percentage = '{:.2f}%'.format(100 * p.get_width() / total)

        print(percentage)
        x = p.get_x() + p.get_width() + 0.02
        y = p.get_y() + p.get_height() / 2
        ax.annotate(percentage,(x,y))


df = pd.DataFrame({'question': ['Agree','Strongly agree'],'count': [200,400]})
plot_barplot(df)
plt.show()