回答:
実際、それは非常に簡単です。ビンの数の代わりに、ビンの境界のリストを与えることができます。それらも不均等に分散する可能性があります。
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))
(data.max() - data.min()) / number_of_bins_you_want
。これ+ binwidth
を変更し1
て、これをより簡単に理解できる例にすることができます。
lw = 5, color = "white"
または同様のものがバー間に白いギャップを挿入する
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までの配列を生成することに注意してください。
簡単な方法は、データの最小値と最大値を計算してから計算することだと思いますL = max - min
。次にL
、目的のビンの幅で除算し(これがビンサイズの意味であると想定しています)、この値の上限をビンの数として使用します。
私は物事が自動的に起こり、ビンが「素敵な」値に落ちるのが好きです。以下はかなりうまくいくようです。
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.]
desired_bin_size=0.05
、min_boundary=0.850
、max_boundary=2.05
の計算は、n_bins
となるint(23.999999999999993)
代わりに、少なすぎる24、したがって1つのビン23内のどの結果。整数変換前の丸めは私にとってうまくn_bins = int(round((max_boundary - min_boundary) / desired_bin_size, 0)) + 1
変位値を使用してビンを均一にし、サンプルに適合させます。
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')
np.arange(0, 1.01, 0.5)
またはで置き換えることができnp.linspace(0, 1, 21)
ます。エッジはありませんが、ボックスの面積は同じですが、X軸の幅が異なります。
私はOPと同じ問題を抱えていました(私はそう思います!)が、Lastaldaが指定した方法で動作させることができませんでした。質問を適切に解釈したかどうかはわかりませんが、別の解決策を見つけました(ただし、それはおそらく本当に悪い方法です)。
これは私がそれをした方法でした:
plt.hist([1,11,21,31,41], bins=[0,10,20,30,40,50], weights=[10,1,40,33,6]);
これはこれを作成します:
したがって、最初のパラメーターは基本的にビンを「初期化」します。具体的には、binsパラメーターで設定した範囲内の数値を作成しています。
これを示すために、最初のパラメーター([1,11,21,31,41])の配列と、2番目のパラメーター([0,10,20,30,40,50])の 'bins'配列を見てください。 :
次に、「重み」パラメーターを使用して各ビンのサイズを定義します。これは、重みパラメータに使用される配列です:[10,1,40,33,6]。
したがって、0から10のビンには値10が与えられ、11から20のビンには値1が与えられ、21から30のビンには値40が与えられます。