matplotlib直方图:如何在条形图上显示计数?

xuh*_*dev 6 python matplotlib

使用matplotlib的hist功能,如何让它显示条形图上每个bin的计数?

例如,

import matplotlib.pyplot as plt
data = [ ... ] # some data
plt.hist(data, bins=10)
Run Code Online (Sandbox Code Playgroud)

我们怎样才能在每个bin显示屏上显示计数?

tdy*_*tdy 46

matplotlib 3.4.0 中的新增功能

有一种新plt.bar_label方法可以自动为条形容器添加标签。

plt.hist返回 bar 容器作为第三个输出:

data = np.random.default_rng(123).rayleigh(1, 70)
counts, edges, bars = plt.hist(data)
#              ^

plt.bar_label(bars)
Run Code Online (Sandbox Code Playgroud)

如果您有分组或堆叠直方图,bars将包含多个容器(每组一个),因此迭代:

fig, ax = plt.subplots()
counts, edges, bars = ax.hist([data, data * 0.3], histtype='barstacked')

for b in bars:
    ax.bar_label(b)
Run Code Online (Sandbox Code Playgroud)

请注意,您还可以通过以下方式访问酒吧容器ax.containers

for c in ax.containers:
    ax.bar_label(c)
Run Code Online (Sandbox Code Playgroud)


小智 8

看来hist不能这样做,你可以写一些像:

your_bins=20
data=[]
arr=plt.hist(data,bins=your_bins)
for i in range(your_bins):
    plt.text(arr[1][i],arr[0][i],str(arr[0][i]))
Run Code Online (Sandbox Code Playgroud)


v.t*_*ala 6

不是单独使用plt.hist()但具有一些附加功能的解决方案。

如果您不想事先指定您的 bin 并且只绘制密度条,但还想显示 bin 计数,您可以使用以下内容。

import numpy as np
import matplotlib.pyplot as plt

data = np.random.randn(100)
density, bins, _ = plt.hist(data, density=True, bins=20)
count, _ = np.histogram(data, bins)
for x,y,num in zip(bins, density, count):
    if num != 0:
        plt.text(x, y+0.05, num, fontsize=10, rotation=-90) # x,y,str
Run Code Online (Sandbox Code Playgroud)

结果如下所示:

在此处输入图片说明