Seaborn 直方图 bin 宽度未扩展到 bin 标签

Seaborn's histrogram bin widths not extending to bin labels

这个问题与我上一个问题不同。 我正在通过以下代码使用 facetgrid 打印直方图。

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt

titanic = sns.load_dataset("titanic")
g= sns.FacetGrid(titanic, col ='survived', size = 3, aspect = 2)
g.map(plt.hist, 'age', color = 'r'), plt.show()
plt.show()

我让 seaborn 决定垃圾箱 labels/values 这就是我想出的

我注意到条形图本身并没有一直延伸到标签。 所以 0-10 标签中的第一个条似乎一直延伸到大约 8,而不是完全延伸到 10。快速 value_count(除非我弄错了)表明第一个条确实只包括8 岁之前的事件。

然后我尝试通过以下代码更改要包含的垃圾箱数量:

g.map(plt.hist, 'age', bins =8, color = 'r'), plt.show()

但是左边的图表看起来还是不对。

所以您在轴上看到的标签与您的 bin 宽度几乎没有关系。实际上,选择轴上的标签使得数据在相应的轴上可见。如果让 seaborn(实际上是 matplotlib)选择 bin 大小和数量,也会发生类似的事情。如果指定 bin 编号,则选择 bin 的宽度,使整个 x 范围的数据都位于 bin 内。

如果你想控制 bin 的宽度,你需要为 bin 参数传递一个列表,而不仅仅是一个数字。假设您想要从 0 到 100 的 10 个 bin,您可以这样写:

g.map(plt.hist, 'age', bins=range(0, 110, 10)], color = 'r')

哪个会给你:

所以,bins 看起来像 [0, 10, ..., 100]

您可能不希望如此硬编码,并希望有一些更灵活的方式来指定 bin。一种选择是定义 bin 宽度,并从数据的开始到结束都有 bin。这可能看起来像这样:

b_width = 10  # chose an arbitrary value here
my_bins = np.arange(min(titanic['age']), max(titanic['age']) + b_width, b_width)
g.map(plt.hist, 'age', bins=my_bins, color = 'r')

注意:np.arange 是必需的,因为我们正在使用浮点数。如果您的数据仅为整数,您也可以为此使用 range

现在您可能还想调整 xticks 以便它们也显示 bin 启动。 Pyplot 有方便的命令:

plt.xticks(range(0, 110, 10))

或后一个例子:

plt.xticks(np.around(my_bins, decimals=1))

可能需要 np.around,因为您的数据可能从浮点数开始,这在 x 轴刻度标签上看起来很难看。 还要注意 plt.xticks 可以做更多方便的事情,所以你应该去 have a loock.

希望对您有所帮助!