2017-08-24 4 views
1

これに簡単な答えがあると確信しています。私は間違ったことを見ていますが、私のパイロットのヒストグラムはどうなっていますか?ここに出力があります。データはありません小数の年齢(誰の18.5)で、18と24歳の参加者が含まれていますpyplotのヒストグラムビンの重なりを止めるにはどうすればいいですか?

pyplot histogram with overlapping bins

をビンは次のように互い違いに配置されているのはなぜ?現在の幅は1に設定されているので、各バーはビンの幅にする必要があります。バーが完全に異なるビンにあるように見えるときに、幅が0.5未満のときに問題はさらに悪化します。ここで

はコードです:

import matplotlib.pyplot as plt 
import numpy as np 
import pandas as pd 

csv = pd.read_csv('F:\Python\Delete\Delete.csv') 

age = csv.age 
gender = csv.gender 

new_age = age[~np.isnan(age)] 
new_age_f = new_age[gender==2] 
new_age_m = new_age[gender==1] 

plt.hist(new_age_f, alpha=.80, label='Female', width=1, align='left') 
plt.hist(new_age_m, alpha=.80, label='Male', width=1, align='left') 

plt.legend() 

plt.show() 

ありがとうございました!

答えて

4

plt.histには、引数がありません。widthwidthが指定されている場合は、それが基礎パッチに与えられます。つまり、長方形は幅が1になります。これはヒストグラムのビン幅とは無関係で、ヒストグラムコールではwidthを使用する理由はほとんどないと思います。

代わりに、ビンを指定する必要があります。両方のヒストグラムプロットに同じビンを使用したいと思うかもしれません。

import matplotlib.pyplot as plt 
import numpy as np; np.random.seed(5) 
import pandas as pd 

csv = pd.DataFrame({"age" : np.random.randint(18,27, 20), 
        "gender" : np.random.randint(1,3,20)}) 

age = csv.age 
gender = csv.gender 

new_age = age[~np.isnan(age)] 
new_age_f = new_age[gender==2] 
new_age_m = new_age[gender==1] 

bins = np.arange(new_age.values.min(),new_age.values.max()+2) 

plt.hist(new_age_f, alpha=.40, label='Female', bins=bins, ec="k") 
plt.hist(new_age_m, alpha=.40, label='Male', bins=bins, ec="k") 

plt.legend() 

plt.show() 

enter image description here

+0

ありがとうございました!ビンを定義することで、それを直しました。フォローアップの質問として、私がビンと幅引数の両方を省略すると、なぜヒストグラムがずれるのか、あなたは知っていますか? [これらの巨大なビンサイズの穴](http://imgur.com/aXXLBz2)を出力に残すデフォルトの動作はなぜですか? – Inflorescence

+1

デフォルトでは、matplotlibは最小値と最大値の間に10個のビンを使用します。いくつかのビンは、例えばあなたが言ったように19.5歳の誰も持っていないので、19.2と19.8の間は空です。 – ImportanceOfBeingErnest

関連する問題