2017-06-22 10 views
0

を作成します。matplotlibのカテゴリ棒グラフは、私はこのようになりますデータフレームを持って、不要な空白

import numpy as np 
import pandas as pd 

location = list(range(1, 34)) 
location += [102, 172] 
stress = np.random.randint(1,1000, len(location)) 
group = np.random.choice(['A', 'B'], len(location)) 

df = pd.DataFrame({'location':location, 'stress':stress, 'group':group}) 
df[['location', 'group']] = df[['location', 'group']].astype(str) 

注:locationgroupは私がlocationように、AAバープロットを作成しようとしている両方の文字列

です(categorical)はx軸にあり、stressは各バーの高さです。

f, axarr = plt.subplots(1, 1) 
axarr.bar(df['location'], df['stress']) 
plt.xticks(np.arange(df.shape[0]) + 1, df['location']) 
plt.show() 

はしかし、これは生成します:

enter image description here

私はまた、私は以下の私が試した各group

に異なる色で各バーを色付けしたいですなぜエンドバーの間に空白があるのか​​分かりません。私はと172の値がlocationであることを推測していますが、その列は文字列なので、カテゴリ変数として扱われることを期待しています。location "value"に関係なく、 。 xtickの位置とラベルを手動で指定して修正しようとしましたが、動作していないようです。

最後に、groupで各バーを色分けする簡単な方法がありますか?groupの値を手作業で繰り返す必要はありませんか?

答えて

1

locationがカテゴリデータの場合は、バープロットを作成しないでください。

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

location = list(range(1, 34)) 
location += [102, 172] 
stress = np.random.randint(1,1000, len(location)) 
group = np.random.choice(['A', 'B'], len(location)) 

df = pd.DataFrame({'location':location, 'stress':stress, 'group':group}) 
df[['location', 'group']] = df[['location', 'group']].astype(str) 
f, axarr = plt.subplots(1, 1) 
bars = axarr.bar(np.arange(df.shape[0]), df['stress']) 
for b, g in zip(bars.patches, df['group']): 
    if g == 'A': 
     b.set_color('b') 
    elif g == 'B': 
     b.set_color('r') 
plt.xticks(np.arange(df.shape[0]) + bars.patches[0].get_width()/2, df['location']) 
plt.setp(axarr.xaxis.get_ticklabels(), rotation=90) 
plt.show() 

を一括でバーの色を設定するための簡潔な方法があるかどうか分からない:バープロットを作成し、後でticklabels設定するnp.arange(df.shape[0])を使用してください。反復はそれほど悪くない... enter image description here

関連する問題