2017-06-22 23 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 (分類)位於x軸上,並且stress是每個小節的高度。此外,我要的顏色各條以不同顏色爲每個group

我已經試過如下:

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

我不知道爲什麼終端欄之間有空白。我猜它是因爲location中的102172值,但是,該列是一個字符串,所以我期待它被視爲分類變量,並且所有的小節不管location「值」 。我試圖通過手動指定XTICK位置和標籤來糾正這一點,但它似乎沒有工作

最後,有一個快速的方法來通過顏色各group酒吧,而無需在每個獨特group值手動循環?

回答

1

如果您的location是分類數據,請不要讓您的條形圖與此相同。使用np.arange(df.shape[0])使條形圖和設置ticklabels更高版本:

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() 

不知道是否有設置欄的顏色散裝簡潔的方式。迭代不是太差... enter image description here