python - 如何为seaborn图设置特定标签?
问题描述
我有一个数据框:
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)
)
推荐阅读
- android - DaggerApplicationComponent 在哪里?
- visual-studio-code - 输入辅助图标 [vscode]
- amazon-ec2 - Android 模拟器硬件按钮(Home、Back、Overview、Volume Up/Down)无法通过 RDP 工作
- django - 尝试从 Windows 中的 docker 恢复 postgresql 数据时出错
- ansible - 如何将 ansible 连接到 EC2 实例?
- python - 如何升级
- .net - 如何将以下 SQL 数据转换为以下给定的 JSON 数据
- .htaccess - 301 使用获取参数和非指定页面重定向特定页面
- python-3.x - 我正在尝试定义一个可以设置目录的函数,但我不知道为什么会一直显示文件存在错误
- ios - App崩溃GameCenterUI:专门的AccessPointRootViewController.supportedInterfaceOrientations.getter