我有以下数据集(df):
``source_city class price
0 Bangalore Business 53671.856898 1 班加罗尔经济 6526.294410 2 钦奈商务 54036.749819 3 钦奈经济 6497.568622 4 德里商业 48614.172893 5 德里经济 6275.093136 6 海得拉巴业务 50357.590531 7 海得拉巴经济 6207.890037 8 加尔各答商业 56401.673678 9 加尔各答经济 7410.881850 10 孟买商业 52666.702876 11 孟买经济 6334.098781 ``
我想使用 python seaborn 库绘制条形图:
我像下面一样尝试了
bar_plot = sns.barplot(x = 'source_city', y = 'price', hue = 'class', data = df)
获取条形标签
for labels in bar_plot.containers: bar_plot.bar_label(labels)
但是我想要百分比(价格)来代替值(价格)作为条形标签 怎么办,请指导。 我可以使用估计器参数吗?如果可以,如何使用?
以下是使用 seaborn 在条形图上获取百分比标签的方法:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 创建示例数据
data = {'source_city': ['Bangalore', 'Bangalore', 'Chennai', 'Chennai', 'Delhi', 'Delhi', 'Hyderabad', 'Hyderabad', 'Kolkata', 'Kolkata', 'Mumbai', 'Mumbai'],
'class': ['Business', 'Economy', 'Business', 'Economy', 'Business', 'Economy', 'Business', 'Economy', 'Business', 'Economy', 'Business', 'Economy'],
'price': [53671.856898, 6526.294410, 54036.749819, 6497.568622, 48614.172893, 6275.093136, 50357.590531, 6207.890037, 56401.673678, 7410.881850, 52666.702876, 6334.098781]}
df = pd.DataFrame(data)
# 按城市计算总价格
total = df.groupby('source_city')['price'].transform('sum')
# 计算每个条形的百分比
df['percentage'] = (df['price'] / total * 100).round(2)
# 创建条形图
plt.figure(figsize=(12, 6)) # 调整图形大小以获得更好的可读性
bar_plot = sns.barplot(x='source_city', y='price', hue='class', data=df)
# 添加百分比标签
for p in bar_plot.patches:
height = p.get_height()
x = p.get_x() + p.get_width() / 2
y = height
label_text = f'{height:.2f}%' # 格式化为两位小数的百分比
bar_plot.text(x, y, label_text, ha='center', va='bottom')
# 设置标签和标题
plt.xlabel('Source City')
plt.ylabel('Price (%)')
plt.title('Price Percentage by Class and Source City')
# 旋转 x 轴标签以获得更好的可读性(如果需要)
plt.xticks(rotation=45)
plt.show()
说明:
- 计算百分比:
-
我们首先使用
groupby
和transform('sum')
按城市计算总价格。 -
然后,我们创建一个名为“percentage”的新列,其中包含每个价格相对于城市总价格的百分比。
-
创建条形图:
-
我们使用
sns.barplot
创建条形图。 -
添加百分比标签:
-
我们遍历条形图的
patches
(代表每个条形)。 - 对于每个条形,我们提取高度、x 位置和 y 位置。
-
我们使用
bar_plot.text()
将百分比标签添加到每个条形,使用f-string
格式将其格式化为两位小数。 -
自定义(可选):
-
调整
plt.figure(figsize)
以更改图形大小。 -
使用
plt.xticks(rotation=45)
旋转 x 轴标签以获得更好的可读性。 -
使用
plt.xlabel
、plt.ylabel
和plt.title
设置标签和标题。
此代码将创建一个条形图,其中每个条形都带有代表其相对于城市总价格的百分比的标签。
标签:python,seaborn,bar-chart From: 78790550