如何用计数和百分比注释水平条形图
How to annotate horizontal bar plots with count and percent
如何获取每个条形右侧的计数和百分比???目前我只知道如何获取计数
import pandas as pd
import matplotlib.pyplot as plt
age = ['0-17','18-60','61-80']
df3 = pd.DataFrame(data={'Male':[82,550,25], 'Female':[72,309,7]}, index=age)
print(df3)
ax = df3.plot(kind='barh', ylabel='Age', title='Passenger Count by Age and Sex')
ax.set(xlabel='No. of Passengers')
for c in ax.containers:
# set the bar label
ax.bar_label(c, fmt='%.0f', label_type='edge')
ax.legend(title='Sex', bbox_to_anchor=(1, 1.02), loc='upper left')
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
plt.show()
函数 bar_label
接受带有要使用的标签列表的参数 label=
。可以通过遍历数据帧来创建字符串列表。
查看此 answer 以获得函数的详尽解释和更多示例。
以下示例代码使用 100% 表示所有乘客:
import pandas as pd
import matplotlib.pyplot as plt
age = ['0-17', '18-60', '61-80']
df3 = pd.DataFrame(data={'Male': [82, 550, 25], 'Female': [72, 309, 7]}, index=age)
ax = df3.plot(kind='barh', ylabel='Age', title='Passenger Count by Age and Sex')
ax.set(xlabel='No. of Passengers')
total = sum(df3.sum())
for c, col in zip(ax.containers, df3.columns):
ax.bar_label(c, label_type='edge', labels=[f'{val}\n{val / total * 100.0:.1f} %' for val in df3[col]])
ax.legend(title='Sex', bbox_to_anchor=(1, 1.02), loc='upper left')
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
plt.tight_layout()
plt.show()
- 以下选项添加了一个条件,如果柱值为 0,则为空字符串。
- 赋值表达式 (
:=
) 可用于 python 3.8
ax = df3.plot(kind='barh', ylabel='Age', title='Passenger Count by Age and Sex', width=0.75)
ax.set(xlabel='No. of Passengers')
tot = df.sum().sum()
# add annotations
for c in ax.containers:
# custom label calculates percent and add an empty string so 0 value bars don't have a number
labels = [f'{w/tot*100:0.1f}%\n{w}' if (w := v.get_width()) > 0 else '' for v in c]
ax.bar_label(c, labels=labels, label_type='edge', padding=0.3)
ax.margins(x=0.15)
如何获取每个条形右侧的计数和百分比???目前我只知道如何获取计数
import pandas as pd
import matplotlib.pyplot as plt
age = ['0-17','18-60','61-80']
df3 = pd.DataFrame(data={'Male':[82,550,25], 'Female':[72,309,7]}, index=age)
print(df3)
ax = df3.plot(kind='barh', ylabel='Age', title='Passenger Count by Age and Sex')
ax.set(xlabel='No. of Passengers')
for c in ax.containers:
# set the bar label
ax.bar_label(c, fmt='%.0f', label_type='edge')
ax.legend(title='Sex', bbox_to_anchor=(1, 1.02), loc='upper left')
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
plt.show()
函数 bar_label
接受带有要使用的标签列表的参数 label=
。可以通过遍历数据帧来创建字符串列表。
查看此 answer 以获得函数的详尽解释和更多示例。
以下示例代码使用 100% 表示所有乘客:
import pandas as pd
import matplotlib.pyplot as plt
age = ['0-17', '18-60', '61-80']
df3 = pd.DataFrame(data={'Male': [82, 550, 25], 'Female': [72, 309, 7]}, index=age)
ax = df3.plot(kind='barh', ylabel='Age', title='Passenger Count by Age and Sex')
ax.set(xlabel='No. of Passengers')
total = sum(df3.sum())
for c, col in zip(ax.containers, df3.columns):
ax.bar_label(c, label_type='edge', labels=[f'{val}\n{val / total * 100.0:.1f} %' for val in df3[col]])
ax.legend(title='Sex', bbox_to_anchor=(1, 1.02), loc='upper left')
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
plt.tight_layout()
plt.show()
- 以下选项添加了一个条件,如果柱值为 0,则为空字符串。
- 赋值表达式 (
:=
) 可用于python 3.8
- 赋值表达式 (
ax = df3.plot(kind='barh', ylabel='Age', title='Passenger Count by Age and Sex', width=0.75)
ax.set(xlabel='No. of Passengers')
tot = df.sum().sum()
# add annotations
for c in ax.containers:
# custom label calculates percent and add an empty string so 0 value bars don't have a number
labels = [f'{w/tot*100:0.1f}%\n{w}' if (w := v.get_width()) > 0 else '' for v in c]
ax.bar_label(c, labels=labels, label_type='edge', padding=0.3)
ax.margins(x=0.15)