在累积条形图的每一步添加标签

Add label at each step of cumulative bar plot

如何为这个累积步骤函数的每个步骤添加标签,如所附屏幕截图所示?

import pandas as pd

df = pd.DataFrame({"year": range(1990, 2020, 4), "name": list("abcdefgh")})
df.year.hist(cumulative=True)

您可以遍历生成的柱。它们的 x 坐标和宽度表明它们在 x 轴上的位置。条形高度给出了标签的 y 值。 x 轴上的位置将给出一个范围,可以从数据框的相应列中选择。标签的x位置,可以用对应的年份。

需要注意一些事项,因为最后一个值可能超出最后一个柱的官方范围。此外,增加 y 边距有助于将所有文本放入图中。

import pandas as pd

df = pd.DataFrame({'year': range(1990, 2020, 4), 'name': [*'abcdefgh']})
ax = df.year.hist(cumulative=True)

for rect in ax.patches:
    left = rect.get_x()
    right = left + rect.get_width()
    height = rect.get_height()
    if rect == ax.patches[-1]: # make sure the last range is wide enough to include the last date
        right += 1
    df2 = df[(df['year'] >= left) &  (df['year'] <= right)]
    for year, name in zip(df2['year'], df2['name']):
        ax.text(year, height, f'{name}\n', ha='left', va='center')
ax.margins(y=0.15) # we need more room for the last label

PS:如果每个柱只写一个标签,您可以在 for 循环中添加一个 break

    for year, name in zip(df2['year'], df2['name']):
        ax.text(year, height, f'{name}\n', ha='left', va='center')
        break

对于阶梯图,您可以使用:

import pandas as pd

df = pd.DataFrame({'year': range(1990, 2020, 4), 'name': [*'abcdefgh']})
ax = df.reset_index().plot(x='year', y='index', drawstyle="steps", legend=False)

for ind, (year, name) in enumerate(zip(df['year'], df['name'])):
    ax.text(year, ind, f' {name}', ha='left', va='center')