2017-11-01 11 views
1

df1df2という2つのパンダデータフレームがあり、それぞれが2つの列、hourvalueを持っているとします。 2つのデータフレームには時間の一部が欠落しています。2つのパンダのデータフレームに結合し、サイドバイサイドのバープロットを生成しますか?

import pandas as pd 
import matplotlib.pyplot as plt 
data1 = [ 
    ('hour', [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
       13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]), 
    ('value', [12.044324085714285, 8.284134466666668, 9.663580800000002, 
       18.64010145714286, 15.817029916666664, 13.242198508695651, 
       10.157177889201877, 9.107153674476985, 10.01193336545455, 
       16.03340384878049, 16.037368506666674, 16.036160044827593, 
       15.061596637500001, 15.62831551764706, 16.146087032608694, 
       16.696574719512192, 16.02603831463415, 17.07469460470588, 
       14.69635686969697, 16.528905725581396, 12.910250661111112, 
       13.875522341935481, 12.402971938461539]) 
    ] 

df1 = pd.DataFrame.from_items(data1) 
df1.head() 
# hour  value 
# 0  0 12.044324 
# 1  1 8.284134 
# 2  2 9.663581 
# 3  4 18.640101 
# 4  5 15.817030 

data2 = [ 
    ('hour', [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 
       15, 16, 17, 18, 19, 20, 21, 22, 23]), 
    ('value', [27.2011904, 31.145661266666668, 27.735570511111113, 
       18.824297487999996, 17.861847334275623, 25.3033003254902, 
       22.855934450000003, 31.160574200000003, 29.080220000000004, 
       30.987719745454548, 26.431310216666663, 30.292641480000004, 
       27.852885586666666, 30.682682472727276, 29.43023531764706, 
       24.621718962500005, 33.92878745, 26.873105866666666, 
       34.06412232, 32.696606333333335]) 
    ] 

df2 = pd.DataFrame.from_items(data2) 
df2.head() 
# hour  value 
# 0  0 27.201190 
# 1  5 31.145661 
# 2  6 27.735571 
# 3  7 18.824297 
# 4  8 17.861847 

私はhourのキーを使用して、それらを一緒に参加し、その後、データのサイド・バイ・サイドbarplotを生産したいと思います。 x軸はhoury-axisvalueとなります。

一度に1つのデータフレームの棒グラフを作成できます。

_ = plt.bar(df1.hour.tolist(), df1.value.tolist()) 
_ = plt.xticks(df1.hour, rotation=0) 
_ = plt.grid() 
_ = plt.show() 

enter image description here

_ = plt.bar(df2.hour.tolist(), df2.value.tolist()) 
_ = plt.xticks(df2.hour, rotation=0) 
_ = plt.grid() 
_ = plt.show() 

enter image description here

しかし、私が欲しいのは、このように、それらの棒グラフに並べて作成することです:

enter image description here

ありがとうございました助けを求めて

答えて

1

最初にデータフレームのインデックスを再作成し、データを使用して2つのバープロットを作成します。長方形の位置は、(x - width/2, x + width/2, bottom, bottom + height)で与えられます。

import numpy as np 

index = np.arange(0, 24) 
bar_width = 0.3 

df1 = df1.set_index('hour').reindex(index) 
df2 = df2.set_index('hour').reindex(index) 

plt.figure(figsize=(10, 5)) 
plt.bar(index - bar_width/2, df1.value, bar_width, label='df1') 
plt.bar(index + bar_width/2, df2.value, bar_width, label='df2') 
plt.xticks(index) 
plt.legend() 

plt.tight_layout() 
plt.show() 

plot

+0

感謝を使用しています。しかし、x軸は0から23で、0から22ではありません。 – stackoverflowuser2010

+0

私の悪い、それは範囲のタイプミスです...固定! – araraonline

+0

ありがとうございます。 'bar_width/2'の計算のようなことをせずにグラフを生成する自動化された方法がありますか? – stackoverflowuser2010

1

ご希望の場合は、1行でそれをすべて行うことができます。パンダプロットラッパーを使用し、データフレームを複数の列でプロットすることによってプロットがグループ化されるという事実を利用します。質問からdf1df2の定義を考えると、あなたはそれがいずれかの一部ではないとして、これはこの場合には数3を抜けていることを注意

enter image description here

その結果

pd.merge(df1,df2, how='outer', on=['hour']).set_index("hour").plot.bar() 
plt.show() 

を呼び出すことができます2つのデータフレームのいずれかにそれを含めるには、reset_index

pd.merge(df1,df2, how='outer', on=['hour']).set_index("hour").reindex(range(24)).plot.bar() 

enter image description here

関連する問題