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

ax.annotate text partially appearing outside the figure box

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

这是我的代码

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', data=df, 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))

数据框看起来像这样

我建议你增加 the axes' margins(在这种情况下在 x 方向)。那就是 space 数据的最大值和轴上的最大比例之间的距离。您将不得不根据需要调整该值,但看起来 0.1 或 0.2 的值应该足够了。

添加:

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

到函数顶部

完整代码:

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', data=df, 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()