web-dev-qa-db-ja.com

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

Matplotlibを使用してヒストグラムを作成しています。

基本的に、ビンの数ではなく、ビンのサイズを手動で設定する方法があるかどうか疑問に思っています。

アイデアをお持ちの方は大歓迎です。

ありがとう

125
Sam Creamer

実際、それは非常に簡単です。ビンの数の代わりに、ビンの境界を含むリストを指定できます。また、不均等に配布することもできます。

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

均等に分散したい場合は、範囲を使用するだけです:

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

元の回答に追加

上記の行は、整数で埋められたdataに対してのみ機能します。 マクロコスメ が指摘するように、フロートには以下を使用できます:

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

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は、min_Edgeからmax_Edgeまでの配列をN + 1値またはN個のビンに分割して生成することに注意してください。

13
user1048442

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

4
Il-Bhima

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

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 __== '__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.]

computed bins histogram

1
pay_it_forward

分位を使用して、ビンを均一にし、サンプルに合わせます:

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')

enter image description here

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

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

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

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

image showing histogram graph created in matplotlib

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

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

  • 番号1(最初の配列から)は0から10(「ビン」配列内)の間にあります
  • 番号11(最初の配列から)は11と20の間にあります(「ビン」配列内)
  • 数値21(最初の配列から)は21から30(「ビン」配列内)などの間にあります。

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

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

1
bluguy