如何为 seaborn 图表设置特定标签?

How to set specific labels to seaborn graph?

我有一个数据框:

import random
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

val = random.sample(range(0, 1000), 1000)
prob = []
for i in range(0,1000):
    x = random.uniform(0,1)
    prob.append(x)   
d = {'Value': val, 'Probability': prob}
df = pd.DataFrame(data=d)

在这里,我根据 df 的值创建了一个额外的数据框:

group_prob = df.groupby(pd.cut(df['Probability'], np.arange(0, 1.1, 0.1)))['Value'].mean()
group_prob = group_prob.fillna(0.0)
group_prob = pd.DataFrame(group_prob)
group_prob["Count"] = df.groupby(pd.cut(df['Probability'], np.arange(0, 1.1, 0.1)))['Value'].count()
group_prob["Text"] = group_prob['Value'].round(2).astype(str)+' - '+group_prob['Count'].astype(str)

我想创建条形图:

def barplot_groups(group_, var_names=['','']):
    fig, ax = plt.subplots(figsize=(15,7))
    sns.barplot(group_.index, group_.values, ax=ax)
    max_val = group_.values.max()
    plt.xlabel(f'{var_names[0]}')
    plt.ylabel(f'Average of {var_names[1]}')
    plt.title(f'Relationship between {var_names[0]} and {var_names[1]}')
    plt.show()

这是我的结果:

barplot_groups(group_prob['Value'], ['Probability','Value'])

我还想根据 group_prob['Text'] 向绘图添加标签,因为值很长我想将它们垂直放置,使用 seaborn 库的最佳方法是什么? 这是我要添加的示例(不需要白板)。

使用 matplotlib 3.4.0 或更新版本,bar_label 可以从标签集合中应用,例如 group_prob['Text']:

def barplot_groups(group_, my_labels, var_names):
    fig, ax = plt.subplots(figsize=(15, 7))
    sns.barplot(x=group_.index, y=group_.values, ax=ax)
    ax.set(xlabel=f'{var_names[0]}',
           ylabel=f'Average of {var_names[1]}',
           title=f'Relationship between {var_names[0]} and {var_names[1]}')

    ax.bar_label(ax.containers[0], labels=my_labels, label_type='center',
                 rotation=90)
    plt.show()

函数调用:

barplot_groups(group_prob['Value'],
               my_labels=group_prob['Text'],
               var_names=['Probability', 'Value'])

group_prob:

                  Value  Count          Text
Probability                                 
(0.0, 0.1]   482.278846    104  482.28 - 104
(0.1, 0.2]   495.018692    107  495.02 - 107
(0.2, 0.3]   529.750000     92   529.75 - 92
(0.3, 0.4]   490.933333    105  490.93 - 105
(0.4, 0.5]   469.858491    106  469.86 - 106
(0.5, 0.6]   515.640777    103  515.64 - 103
(0.6, 0.7]   545.450980    102  545.45 - 102
(0.7, 0.8]   458.900000     80    458.9 - 80
(0.8, 0.9]   468.100000    110   468.1 - 110
(0.9, 1.0]   542.153846     91   542.15 - 91


只需将 backgroundcolor='white' 添加到 bar_label 以获得白色背景:

ax.bar_label(ax.containers[0], labels=my_labels, label_type='center',
             rotation=90, backgroundcolor='white')


可用种子 5 重现:

import random
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

random.seed(5)
val = random.sample(range(0, 1000), 1000)
prob = []
for i in range(0, 1000):
    x = random.uniform(0, 1)
    prob.append(x)
d = {'Value': val, 'Probability': prob}
df = pd.DataFrame(data=d)

group_prob = df.groupby(
    pd.cut(df['Probability'], np.arange(0, 1.1, 0.1))
)['Value'].mean()
group_prob = group_prob.fillna(0.0)
group_prob = pd.DataFrame(group_prob)
group_prob["Count"] = df.groupby(
    pd.cut(df['Probability'], np.arange(0, 1.1, 0.1))
)['Value'].count()
group_prob["Text"] = (
        group_prob['Value'].round(2).astype(str)
        + ' - ' +
        group_prob['Count'].astype(str)
)