Matplotlibのビンサイズ(ヒストグラム)


回答:


270

実際、それは非常に簡単です。ビンの数の代わりに、ビンの境界のリストを与えることができます。それらも不均等に分散する可能性があります。

plt.hist(data, bins=[0, 10, 20, 30, 40, 50, 100])

均等に分散させたい場合は、単にrangeを使用できます。

plt.hist(data, bins=range(min(data), max(data) + binwidth, binwidth))

元の回答に追加されました

上記の行はdata、整数で満たされた場合にのみ機能します。以下のようmacrocosmeが指摘する、山車のためにあなたが使用することができます。

import numpy as np
plt.hist(data, bins=np.arange(min(data), max(data) + binwidth, binwidth))

20
floatで動作するようにrange(...)をnp.arange(...)に置き換えます。
macrocosme 2014

6
ここでbinwidthは何ですか?以前にその値を設定しましたか?
UserYmY 2015

1
この例のbinwidthは次のようにして見つけられると思います(data.max() - data.min()) / number_of_bins_you_want。これ+ binwidthを変更し1て、これをより簡単に理解できる例にすることができます。
Jarad

2
上記のCodingCatの優れたソリューションに加えて、フロートデータの場合、ヒストグラムのバーをxティックにバーの境界を持たずに整数のxティックを中心にしたい場合は、次の微調整を試してください。bins = np.arange(dmin-0.5、 dmax + 0.5 + binwidth、binwidth)
DaveW 2018

3
オプションlw = 5, color = "white"または同様のものがバー間に白いギャップを挿入する
PatrickT

13

Nビンの場合、ビンエッジはN + 1値のリストによって指定されます。最初のNは下部のビンエッジを示し、+ 1は最後のビンの上部エッジを示します。

コード:

from numpy import np; from pylab import *

bin_size = 0.1; min_edge = 0; max_edge = 2.5
N = (max_edge-min_edge)/bin_size; Nplus1 = N + 1
bin_list = np.linspace(min_edge, max_edge, Nplus1)

linspaceは、N + 1値またはNビンに分割されたmin_edgeからmax_edgeまでの配列を生成することに注意してください。


1
ビンには下限が含まれ、上限が含まれないことに注意してください。ただし、両方の境界を含むN + 1(最後)のビンは例外です。
lukewitmer 2016年

4

簡単な方法は、データの最小値と最大値を計算してから計算することだと思いますL = max - min。次にL、目的のビンの幅で除算し(これがビンサイズの意味であると想定しています)、この値の上限をビンの数として使用します。


それはまさに私が考えていたものです、ありがとう。もっと簡単な方法があるかどうか疑問に思っていましたが、これは感謝の意を表しているようです!
サムクリーマー

ラウンド数を使用すると、このアプローチではラウンドビンサイズがわかりません。誰もがそれを経験しましたか?
Brad Urani 2013年

3

私は物事が自動的に起こり、ビンが「素敵な」値に落ちるのが好きです。以下はかなりうまくいくようです。

import numpy as np
import numpy.random as random
import matplotlib.pyplot as plt
def compute_histogram_bins(data, desired_bin_size):
    min_val = np.min(data)
    max_val = np.max(data)
    min_boundary = -1.0 * (min_val % desired_bin_size - min_val)
    max_boundary = max_val - max_val % desired_bin_size + desired_bin_size
    n_bins = int((max_boundary - min_boundary) / desired_bin_size) + 1
    bins = np.linspace(min_boundary, max_boundary, n_bins)
    return bins

if __name__ == '__main__':
    data = np.random.random_sample(100) * 123.34 - 67.23
    bins = compute_histogram_bins(data, 10.0)
    print(bins)
    plt.hist(data, bins=bins)
    plt.xlabel('Value')
    plt.ylabel('Counts')
    plt.title('Compute Bins Example')
    plt.grid(True)
    plt.show()

結果には、ビンサイズの適切な間隔のビンがあります。

[-70. -60. -50. -40. -30. -20. -10.   0.  10.  20.  30.  40.  50.  60.]

計算されたビンのヒストグラム


まさに私が探していたもの!ただし、浮動小数点の精度が原因でn_binsが切り捨てられる場合があります。例えばためdesired_bin_size=0.05min_boundary=0.850max_boundary=2.05の計算は、n_binsとなるint(23.999999999999993)代わりに、少なすぎる24、したがって1つのビン23内のどの結果。整数変換前の丸めは私にとってうまくn_bins = int(round((max_boundary - min_boundary) / desired_bin_size, 0)) + 1
いき

3

変位値を使用してビンを均一にし、サンプルに適合させます。

bins=df['Generosity'].quantile([0,.05,0.1,0.15,0.20,0.25,0.3,0.35,0.40,0.45,0.5,0.55,0.6,0.65,0.70,0.75,0.80,0.85,0.90,0.95,1]).to_list()

plt.hist(df['Generosity'], bins=bins, normed=True, alpha=0.5, histtype='stepfilled', color='steelblue', edgecolor='none')

ここに画像の説明を入力してください


1
いい案。変位値のリストをnp.arange(0, 1.01, 0.5)またはで置き換えることができnp.linspace(0, 1, 21)ます。エッジはありませんが、ボックスの面積は同じですが、X軸の幅が異なります。
Tomasz Gandor

2

私はOPと同じ問題を抱えていました(私はそう思います!)が、Lastaldaが指定した方法で動作させることができませんでした。質問を適切に解釈したかどうかはわかりませんが、別の解決策を見つけました(ただし、それはおそらく本当に悪い方法です)。

これは私がそれをした方法でした:

plt.hist([1,11,21,31,41], bins=[0,10,20,30,40,50], weights=[10,1,40,33,6]);

これはこれを作成します:

matplotlibで作成されたヒストグラムグラフを示す画像

したがって、最初のパラメーターは基本的にビンを「初期化」します。具体的には、binsパラメーターで設定した範囲内の数値を作成しています。

これを示すために、最初のパラメーター([1,11,21,31,41])の配列と、2番目のパラメーター([0,10,20,30,40,50])の 'bins'配列を見てください。 :

  • 数値1(最初の配列から)は0から10の間( 'bins'配列内)
  • (最初の配列からの)数値11は、11と20の間にあります(「bins」配列内)
  • 21(最初の配列から)は21と30(「bins」配列内)の間にあります。

次に、「重み」パラメーターを使用して各ビンのサイズを定義します。これは、重みパラメータに使用される配列です:[10,1,40,33,6]。

したがって、0から10のビンには値10が与えられ、11から20のビンには値1が与えられ、21から30のビンには値40が与えられます。


3
ヒストグラム機能の動作について、基本的な誤解があると思います。生データが必要です。したがって、この例では、データ配列には0〜10の10個の値、10〜20個の1個の値などが含まれている必要があります。次に、関数は合計と描画を行います。上記で行っているのは、すでに合計があるためです(「重み」オプションを誤用してグラフに挿入します)。これで混乱が解消されることを願っています。
CodingCat

-1

整数のx値を持つヒストグラムの場合、私は結局使用しました

plt.hist(data, np.arange(min(data)-0.5, max(data)+0.5))
plt.xticks(range(min(data), max(data)))

0.5のオフセットは、ビンをx軸の値の中央に配置します。このplt.xticks呼び出しは、すべての整数に目盛りを追加します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.