データを視覚化する際に、ヒストグラムはデータの分布を把握するのに非常に便利なツールです。matplotlibを使ってヒストグラムを作成する際、x軸のビンサイズ(区間)をカスタムで決めることができます。通常、plt.hist()でbinsを指定すると、データの範囲全体を等間隔に分割しますが、自分で範囲や区間をカスタム設定することも可能です。
この記事では、x軸のビンサイズをカスタムで決める方法について解説します。例えば、データが0から1の範囲に集中している場合、この範囲で20分割する方法を見ていきます。
基本的なヒストグラムの作成
まずは、基本的なヒストグラムの作成方法を確認してみましょう。以下の例では、numpyを使ってランダムなデータを生成し、そのデータをヒストグラムで可視化します。
1 2 3 4 5 6 7 8 9 10 11 |
import numpy as np import matplotlib.pyplot as plt np.random.seed(0) data = np.random.randn(1000) plt.hist(data, bins=20) plt.title('Basic Histogram') plt.xlabel('Value') plt.ylabel('Frequency') plt.show() |

このコードでは、bins=20を指定してデータの範囲を20等分したヒストグラムを作成しています。しかし、この方法ではビンの範囲はデータの最小値から最大値まで自動的に設定されるので、次のようなデータのとき困ります。
1 2 3 4 5 6 7 8 |
# これだとわからない data[-1] = 1e3 plt.hist(data, bins=20) plt.title('Basic Histogram') plt.xlabel('Value') plt.ylabel('Frequency') plt.show() |

カスタムのビンサイズを設定する
次に、x軸のビンサイズをカスタムで設定する方法を見てみましょう。例えば、データの範囲に関係なく、0から1の間を20分割したい場合は、以下のようにbins引数にカスタムのビンエッジを指定します。
1 2 |
# 0から1の範囲を20分割するビンのエッジを作成 bins = np.linspace(0, 1, 21) |
1 2 3 4 5 |
plt.hist(data, bins=bins) plt.title('Histogram with Custom Bins') plt.xlabel('Value') plt.ylabel('Frequency') plt.show() |

このコードでは、np.linspace(0, 1, 21)を使って、0から1までを20分割する21個のビンエッジを生成しています。これにより、ヒストグラムは0から1の範囲でデータを表示し、その範囲外のデータは無視されます。
ビンサイズを柔軟に調整する方法
カスタムビンをさらに柔軟に調整するために、特定の範囲に集中してビンを配置したい場合など、手動でビンエッジを定義することが有効です。例えば、特定のデータ範囲にビンを集中させ、それ以外の範囲を粗く分割するようなケースを考えてみましょう。
1 2 |
#カスタムビンのエッジを手動で定義 bins = np.concatenate([np.linspace(-3, 0, 15), np.linspace(0, 3, 6), np.linspace(3, 1e3, 5)]) |
1 2 3 4 5 6 |
plt.hist(data, bins=bins) plt.title('Histogram with Manually Defined Bins') plt.xlabel('Value') plt.ylabel('Frequency') plt.xlim(-5, 5) plt.show() |

このコードでは、-3から0までを細かく、0から3までを細かく、そして3以降はもっと粗く分割したビンエッジを定義しています。これにより、特定の範囲に焦点を当てたヒストグラムを作成できます。
x軸の範囲を全部にすると以下のようになります。

まとめ
matplotlibでヒストグラムを作成する際、x軸のビンサイズをカスタムで設定することで、データをより柔軟に視覚化することが可能になりますよ!