【问题标题】:Matplotlib histogram shifted xticksMatplotlib 直方图移动 xticks
【发布时间】:2020-09-29 10:56:43
【问题描述】:

由于某种原因,我的直方图上的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 的最开头移动。

【问题讨论】:

  • 请发布一个情节,以便我们了解您的意思。另外,说明 matplotlib 的版本也很有用
  • @smci 有图片链接。

标签: python matplotlib plot xticks


【解决方案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()

【讨论】:

    【解决方案2】:

    问题与 bin 的构造方式有关。

    你有两个选择:

    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 的边界相比,直方图将具有更自然的比例。

    【讨论】:

      猜你喜欢
      • 2015-01-20
      • 2019-11-29
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      • 2012-10-11
      相关资源
      最近更新 更多