在累积条形图的每一步添加标签
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')
如何为这个累积步骤函数的每个步骤添加标签,如所附屏幕截图所示?
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')