如何防止pyplot直方图柱状图重叠?

3

我相信这个问题有一个简单的答案,只是我看事情的角度不对。关于我的pyplot直方图出现了什么问题?下面是输出结果;数据包含年龄在18至24岁之间的参与者,没有小数年龄(没有人是18.5岁):

pyplot histogram with overlapping bins

为什么垃圾桶会这样错落有致?当前宽度设置为1,所以每个条形图应该是一个垃圾桶的宽度,对吧?当宽度小于0.5时,问题变得更加严重,此时条形图看起来就像在完全不同的垃圾桶中。

以下是代码:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

csv = pd.read_csv('F:\Python\Delete\Delete.csv')

age = csv.age
gender = csv.gender

new_age = age[~np.isnan(age)]
new_age_f = new_age[gender==2]
new_age_m = new_age[gender==1]

plt.hist(new_age_f, alpha=.80, label='Female', width=1, align='left')
plt.hist(new_age_m, alpha=.80, label='Male', width=1, align='left')

plt.legend()

plt.show()

谢谢!

1个回答

5

plt.hist没有任何名为width的参数。如果指定了width,它会被传递给底层的矩形补丁(patch),意味着矩形的宽度是1。这与直方图(bin)的宽度无关,我想几乎没有理由在直方图调用中使用width

相反,您需要指定bin(箱子/区间)。您可能还希望对两个直方图图形使用相同的bin。

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(5)
import pandas as pd

csv = pd.DataFrame({"age" : np.random.randint(18,27, 20),
                    "gender" : np.random.randint(1,3,20)})

age = csv.age
gender = csv.gender

new_age = age[~np.isnan(age)]
new_age_f = new_age[gender==2]
new_age_m = new_age[gender==1]

bins = np.arange(new_age.values.min(),new_age.values.max()+2)

plt.hist(new_age_f, alpha=.40, label='Female', bins=bins, ec="k")
plt.hist(new_age_m, alpha=.40, label='Male', bins=bins,  ec="k")

plt.legend()

plt.show()

enter image description here


非常感谢!定义箱子就解决了问题。作为后续问题,您是否知道为什么如果我省略箱子和宽度参数,直方图仍然会呈错开状态?为什么默认行为会在输出中留下这些巨大的箱子大小的空洞? - Inflorescence
1
默认情况下,matplotlib在最小值和最大值之间使用10个bin。一些bin(例如19.2到19.8之间的bin)是空的,因为正如您所说,没有任何人年龄为19.5岁。 - ImportanceOfBeingErnest

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