2017-07-31 3 views
0

私は 'df'と 'df2'というラベルのついたヒストグラムを作成したのと同じフォーマットの2つのデータフレームを持っています。私は 'df_merged'と呼ばれる第3のデータフレームを持っています。これは、データフレームのdfとdf2の組み合わせです。他の2つのヒストグラムバーの合計のヒストグラムをプロットする方法は?

私は「DF」と「DF2」の合計を示すために、第三のヒストグラムバーをしたいです。また、 'df'と 'df2'のヒストグラムを組み合わせた 'df_merged'ヒストグラムに正規化し、 'df'と 'df2'のヒストグラムが結合されたヒストグラムになるようにします。これは実現可能ですか?

x軸で200を開始して以来、私のグラフは不正確に見えます。 'df2'は 'df2'と 'df'の合計であるため、正しくない組み合わせよりも高くなります。私は3つのヒストグラムの各ビンに合計値の数を重み付けしたので、これが起こっていると思います。これは実現可能ですか?

import numpy as np 
import pandas as pd 
from pandas import DataFrame, Series 
import matplotlib.pyplot as plt 
from matplotlib.colors import LinearSegmentedColormap 

df = df[['Column1']] 
df2 = df2[['Column1']] 
df_merged = pd.concat([df, df2], ignore_index=True) 

df_weights = 100*np.ones_like(df.values)/float(len(df)) 
df2_weights = 100*np.ones_like(df2.values)/float(len(df2)) 
df_merged_weights = 100*np.ones_like(df_merged.values)/float(len(df_merged)) 

fig, ax = plt.subplots() 
ax.hist(df.values, bins=25, weights=df_weights, color='black', histtype='step', label='df') 
ax.hist(df2.values, bins=200, weights=df2_weights, color='green', histtype='step', label='df2') 
ax.hist(df_merged.values, bins=200,weights=df_merged_weights,color='red', histtype='step', label='Combined') 

ax.margins(0.05) 
ax.set_ylim(bottom=0) 
ax.set_xlim([0,1000]) 
p.legend(loc='upper right') 

enter image description here

答えて

1

あなたは、連結配列の長さによって、すべてのものを比較検討する必要があります。また、一定のビンサイズとヒストグラムの範囲を保持する必要があります。

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

np.random.seed(0) 
df = DataFrame(np.random.normal(300, 100, 2000)) # Two normal distributions 
df2 = DataFrame(np.random.normal(700, 100, 1500)) 
df_merged = pd.concat([df, df2], ignore_index=True) 

# weights 
df_weights = np.ones_like(df.values)/len(df_merged) 
df2_weights = np.ones_like(df2.values)/len(df_merged) 
df_merged_weights = np.ones_like(df_merged.values)/len(df_merged) 

plt_range = (df_merged.values.min(), df_merged.values.max()) 
fig, ax = plt.subplots() 
ax.hist(df.values, bins=100, weights=df_weights, color='black', histtype='step', label='df', range=plt_range) 
ax.hist(df2.values, bins=100, weights=df2_weights, color='green', histtype='step', label='df2', range=plt_range) 
ax.hist(df_merged.values, bins=100, weights=df_merged_weights, color='red', histtype='step', label='Combined', range=plt_range) 

ax.margins(0.05) 
ax.set_ylim(bottom=0) 
ax.set_xlim([0, 1000]) 
plt.legend(loc='upper right') 
# plt.savefig('output.png') 

Output

matplotlib.axes.Axes.hist

重み参照:(N)array_likeない又はなし、任意

xと同じ形状の重みの配列を、。 x内の各値は、 の代わりに、関連する重みを( 1の代わりに)ビンカウントに寄与します。

+0

私はすべてのバーの合計を1にしたかったので、私は重みを必要としたので、各ビンに合計値の数を重み付けしました。これをコードに組み込むにはどうすればよいですか?私はそれを重み付けすると、ヒストグラムはまだ 'df2'が元の投稿のように結合されたものよりもまだ大きいので、まだ間違っています。 – user112947

+0

私は参照してください...私は答えを更新しました。基本的に、「結合」分布の合計は1であり、他の2つの分布はそれの分数です。これがあなたが探していたものかどうかは分かりません。 – Constructor

+0

ありがとうございました。これはまさに私が探していたものでした。 – user112947

関連する問題