用Matplotlib绘制分类变量的直方图

4

我有一个pandas数据框的列,包含三个可能的分类值。当我尝试使用matplotlib的plt.hist(data['column'])绘制它时,直方图条不与x轴刻度对齐,也不均匀间隔。我该如何解决这个问题?

enter image description here


展示数据给我们看。 - Shubham Periwal
在这里使用seaborn会更容易。你基本上想要一个sns.countplot。(sns.histplot(...., discrete=True)也可以工作,并且有选项来将y轴缩放为概率)。 - JohanC
3个回答

8

直方图用于绘制数值变量(连续或离散)的频率分布。分类变量的频率分布最好用条形图来显示。为此,您需要首先使用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])))

pandas

data['column'].value_counts().plot.bar(rot=0)

pandas_bar


matplotlib

categories = data['column'].value_counts().index
counts = data['column'].value_counts().values
plt.bar(categories, counts, width=0.5)

matplotlib_bar


2

您需要告诉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()

enter image description here


0

参数rwidth指定了您的条形图相对于您的箱子宽度的宽度。例如,如果您的箱子宽度为1,rwidth=0.5,则条形图宽度将为0.5。在条形图的两侧,您将有0.25的空间。

注意:这会在连续的条之间留下0.5的空间。根据您拥有的箱子数量,您不会看到这些空间。但是如果箱子较少,它们会显示出来。


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