Участок с несколькими барами. Как исправить? - PullRequest
0 голосов
/ 31 октября 2019

У меня есть фрейм данных с довольно неровными данными, который выглядит следующим образом:

    Date      | Obj  | Feature | FeatureValue |  
    2019-08-28| DT1  |   foo   |     15       |  
    2019-08-28| DT1  |   bar   |     25       |  
    2019-08-28| DT1  |   baz   |     70       |  
    2019-08-28| DT2  |   foo   |     45       |  
    2019-08-28| DT2  |   baz   |     67       |  
    2019-08-28| DT3  |   foo   |     78       |  
    2019-08-28| DT3  |   bar   |     19       |  
    2019-08-29| DT1  |   foo   |     12       |  
    2019-08-29| DT1  |   bar   |     45       |  
    2019-08-30| DT2  |   foo   |     19       |  
    2019-08-30| DT2  |   bar   |     23       |  
    2019-08-30| DT3  |   foo   |     23       |  
    2019-08-30| DT3  |   baz   |     34       |  

Моя цель - построить графики для каждой даты, где на оси X находится OBJ, на Y - значение элемента и столбцы -Особенности.

Итак, я сделал это:

df = pd.DataFrame(np.array([['2019-08-28', 'DT1', 'foo' ,15], ['2019-08-28', 'DT1', 'bar',25],
                            ['2019-08-28', 'DT1', 'baz', 70], ['2019-08-28', 'DT2', 'foo', 45],   
                            ['2019-08-28', 'DT3', 'baz', 67], ['2019-08-28', 'DT3', 'foo', 78],   
                            ['2019-08-28', 'DT3', 'bar', 19], ['2019-08-29', 'DT1', 'foo', 12],   
                            ['2019-08-28', 'DT1', 'bar', 45], ['2019-08-30', 'DT2', 'foo', 19],   
                            ['2019-08-30', 'DT2', 'bar', 23], ['2019-08-30', 'DT3', 'foo', 23],   
                            ['2019-08-30', 'DT3', 'baz', 34]]),  
                           columns=['Date', 'Obj', 'Feature', 'FeatureValue'])

for date in df.Date.unique():
    DDD = df[df['Date'] == date]
    X = DDD.Obj.unique()
    for obj in X:
        y1 = np.array(DDD[DDD['Obj'] == obj][DDD['Feature']=='foo']['FeatureValue'].values)
        y2 = np.array(DDD[DDD['Obj'] == obj][DDD['Feature']=='bar']['FeatureValue'].values)
        y3 = np.array(DDD[DDD['Obj']==obj][DDD['Feature']=='baz']['FeatureValue'].values)
        width=0.4
        fig, ax = plt.subplots()
        try:
            ax.bar(X, y1, width, color='#000080', label='AC')
            ax.bar(X, width, y2, width, color='#0F52BA', label ='Cell (alarm)')
            ax.bar(X, 2*width, y3, width, color='#6593F5', label='Cell (manual)')
        except:
            pass
        ax.set_title(date)
        ax.legend()
        plt.show()  

В результате я получил что-то вроде этого:

enter image description here

И ошибка IndexError: список индексов вне диапазона со ссылкой на plt.legend (). Что я не прав? Что я должен исправить, чтобы получить нормальный вывод графика?

1 Ответ

1 голос
/ 31 октября 2019

IIUC, вы можете сделать:

for date, data in df.groupby('Date'):
    print(data)
    (data.groupby(['Obj','Feature'])['FeatureValue'].mean()
        .unstack('Feature').plot.bar())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...