1

由于某种原因xticks,我的直方图发生了偏移:

图片链接

这是代码:


data = list(df['data'].to_numpy())
bin = 40
plt.style.use('seaborn-colorblind')
plt.grid(axis='y', alpha=0.5, linestyle='--')
plt.hist(data, bins=bin, rwidth=0.7, align='mid')
plt.yticks(np.arange(0, 13000, 1000))
ticks = np.arange(0, 100000, 2500)
plt.xticks(ticks, rotation='-90', ha='center')
plt.show()

我想知道为什么 x 刻度会在 xaxis 的最开始移动。

4

2 回答 2

1

设置时bins=40,将在最低和最高数据值之间创建 40 个大小相同的 bin。在这种情况下,最高数据值似乎在 左右90000,而最低值在 左右0。将其划分为 40 个区域将导致边界值不取整。因此,最好将 bin 边界明确设置为您真正想要的值,例如将范围 0-100000 划分为 40(即 41 个边界)。

from matplotlib import pyplot as plt
import numpy as np

plt.style.use('seaborn-colorblind')
data = np.random.lognormal(10, 0.4, 100000)
data[data > 90000] = np.nan
fig, axes = plt.subplots(ncols=2, figsize=(12, 4))
for ax in axes:
    if ax == axes[0]:
        bins = 40
        ax.set_title('bins = 40')
    else:
        bins = np.linspace(0, 100000, 41)
        ax.set_title('bins = np.linspace(0, 100000, 41)')
    ax.grid(axis='y', alpha=0.5, linestyle='--')
    ax.hist(data, bins=bins, rwidth=0.7, align='mid')
    ax.set_yticks(np.arange(0, 13000, 1000))
    xticks = np.arange(0, 100000, 2500)
    ax.set_xticks(xticks)
    ax.tick_params(axis='x', labelrotation=-90)


plt.tight_layout()
plt.show()

示例图

于 2020-09-29T11:44:12.553 回答
0

这个问题与垃圾箱的构造方式有关。

你有两个选择:

  1. 直接设置 bin 的范围

    plt.hist(data, bins=bin, rwidth=0.7, range=(0, 100_000), align='mid')

  2. 根据分箱设置 x 轴:

    _, bin_edges, _ = plt.hist(data, bins=bin, rwidth=0.7, align='mid')

    ticks = bin_edges

我推荐 2. 选项。与 bin 的边界相比,直方图将具有更自然的比例。

于 2020-09-29T11:27:09.860 回答