2016-05-27 2 views
3

В Python пандах у меня есть создать dataframe с одним значением для каждого года и два подкласса - то есть, одна метрики для параметра триплетаПанда: множественный бар участок от агрегированных колонн

import pandas, requests, numpy 
import matplotlib.pyplot as plt 

df 

     Metric Tag_1 Tag_2 year 
0  5770832 FOOBAR1 name1 2008 
1  7526436 FOOBAR1 xyz 2008 
2 33972652 FOOBAR1 name1 2009 
3 17491416 FOOBAR1 xyz 2009 
... 
16 6602920 baznar2 name1 2008 
17  6608 baznar2 xyz 2008 
... 
30 142102944 baznar2 name1 2015 
31   0 baznar2 xyz 2015 

Я хотел бы, чтобы произвести bar с метрикой как y-значения над x = (год, Tag_1, Tag_2) и сортировка в основном в течение многих лет, а во-вторых, для tag_1 и цвета баров в зависимости от tag_1. Что-то вроде

(2008,FOOBAR,name1) --> 5770832 *RED* 
(2008,baznar2,name1) --> 6602920 *BLUE* 
(2008,FOOBAR,xyz)  --> 7526436 *RED* 
(2008,baznar2,xyz) --> ...  *BLUE* 
(2008,FOOBAR,name1) --> ...  *RED* 

Я попытался начать с группировкой столбцов, как

df.plot.bar(x=['year','tag_1','tag_2'] 

но не нашли способ отделить выбор в двух стержневых наборов рядом друг с другом.

+0

У вас будет больше шансов получить ответ, если мы сможем создать примерный кадр данных путем копирования и вставки. – andrew

ответ

1

Это должно получить вас на вашем пути:

df = pd.read_csv('path_to_file.csv') 

# Group by the desired columns 
new_df = df.groupby(['year', 'Tag_1', 'Tag_2']).sum() 
# Sort descending 
new_df.sort('Metric', inplace=True) 


# Helper function for generation sequence of 'r' 'b' colors 
def get_color(i): 
    if i%2 == 0: 
     return 'r' 
    else: 
     return 'b' 

colors = [get_color(j) for j in range(new_df.shape[0])] 

# Make the plot 
fig, ax = plt.subplots() 
ind = np.arange(new_df.shape[0]) 
width = 0.65 
a = ax.barh(ind, new_df.Metric, width, color = colors) # plot a vals 
ax.set_yticks(ind + width) # position axis ticks 
ax.set_yticklabels(new_df.index.values) # set them to the names 
fig.tight_layout() 
plt.show() 

enter image description here

0

вы также можете сделать это следующим образом:

fig, ax = plt.subplots() 
df.groupby(['year', 'Tag_1', 'Tag_2']).sum().plot.barh(color=['r','b'], ax=ax) 
fig.tight_layout() 
plt.show() 

PS если не нравится экспоненциальное вы можете получить от него:

ax.get_xaxis().get_major_formatter().set_scientific(False) 

enter image description here