在 Python/Matplotlib 的直方图上添加数据标签

6

我正在尝试在直方图上添加数据标签来展示频率。

以下是我的代码,但不确定如何编写代码将数值放置在顶部:

plt.figure(figsize=(15,10))
plt.hist(df['Age'], edgecolor='white', label='d')
plt.xlabel("Age")
plt.ylabel("Number of Patients")
plt.title = ('Age Distrubtion') 

我想知道有没有人知道如何编写以下代码:

这里输入图片描述


这个回答解决了你的问题吗? Matplotlib - label each bin - undefined
2个回答

17
你可以使用由plt.hist()返回的柱状图来使用新的bar_label()函数。
以下是一个示例:
from matplotlib import pyplot as plt
import pandas as pd
import numpy as np

df = pd.DataFrame({'Age': np.random.randint(20, 60, 200)})

plt.figure(figsize=(15, 10))
values, bins, bars = plt.hist(df['Age'], edgecolor='white')
plt.xlabel("Age")
plt.ylabel("Number of Patients")
plt.title('Age Distrubtion')
plt.bar_label(bars, fontsize=20, color='navy')
plt.margins(x=0.01, y=0.1)
plt.show()

plt.hist() with plt.bar_label()

提示:由于年龄是离散分布,建议显式设置分组边界,例如 plt.hist(df['Age'], bins=np.arange(19.999, 60, 5))


3
请注意,bar_label 仅在 matplotlib 版本 3.4 或更高版本中可用。 - Frumda Grayforce
对我来说,像这样设置标题行不通。我需要像fig, ax = plt.subplots(); ax.set_title = ('年龄分布')这样的东西。 - Julian
@Julian 非常感谢你指出这个错误。看来我只是复制了原始代码的那部分而没有检查它。plt.title = "..." 不仅不起作用,而且使得函数无法访问。正确的方式应该是像你所指示的那样使用 plt.title("...") 或者 ax.set_title("...") - JohanC

2

plt.ylabel() 是一个带有参数的函数,其中 loc 参数可以用于定义标签的位置:

plt.ylabel("Age", loc="top")

如果您想进行手动控制,可以使用**kwargs参数传递Text对象(文档),该对象可接受xy坐标值来放置文本。请注意保留HTML标签。
plt.ylabel("Age", text(x=100, y=200, rotation='horizontal'))

嘿,伙计,谢谢你的回复。然而,当我运行那段代码时,我遇到了以下错误:ValueError: 'top' 不是 loc 的有效值;支持的值为 'left'、'center' 和 'right'。 - Ruben Vellupillai
@RubenVellupillai 我相信你正在运行 plt.xlabel() 的代码,而不是 plt.ylabel() 的。 - Danyal Imran
很抱歉再次提问,但我又遇到了一个错误:NameError: name 'text' is not defined。 - Ruben Vellupillai
1
通过 import matplotlib.pyplot.text as text 导入模块 @RubenVellupillai - Danyal Imran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接