直方图用于绘制数值变量(连续或离散)的频率分布。分类变量的频率分布最好用条形图来显示。为此,您需要首先使用value_counts
计算每个类别的频率,然后您可以使用pandas plot.bar
方便地直接绘制。或者如果您喜欢的话,也可以使用matplotlib,如下所示。
import numpy as np # v 1.19.2
import pandas as pd # v 1.2.3
import matplotlib.pyplot as plt # v 3.3.4
data = pd.DataFrame(dict(column=np.repeat(['F', 'M', '--'], [11000, 13000, 3000])))
data['column'].value_counts().plot.bar(rot=0)
categories = data['column'].value_counts().index
counts = data['column'].value_counts().values
plt.bar(categories, counts, width=0.5)
您需要告诉Matplotlib需要多少个bins(默认情况下,hist
始终使用10个bins),并且必须指定标签的位置,考虑到x轴从0到bin数减1(在我的示例中,从0到2)。
from numpy import array, linspace ; from numpy.random import randint
from matplotlib.pyplot import hist, xticks, show
# synthesize some data
x = array([{0:'A',1:'B',2:'B',3:'B',4:'C',5:'C'}[n] for n in randint(0, 6, 20000)])
nc = len(set(x)) # how many categories
hist(x, bins=nc, rwidth=0.7)
xticks(linspace(0, nc-1, 2*nc+1)[1::2])
show()
参数rwidth
指定了您的条形图相对于您的箱子宽度的宽度。例如,如果您的箱子宽度为1,rwidth=0.5,则条形图宽度将为0.5。在条形图的两侧,您将有0.25的空间。
注意:这会在连续的条之间留下0.5的空间。根据您拥有的箱子数量,您不会看到这些空间。但是如果箱子较少,它们会显示出来。
sns.histplot(...., discrete=True)
也可以工作,并且有选项来将y轴缩放为概率)。 - JohanC