график ошибок с помощью matplotlib на основе многоиндексного фрейма данных pandas

У меня в пандах есть следующий фрейм данных:

>>>name   Hour   trt_level    stress   date          value
0  D43    9         H         control  2019-06-07    0.4561
1  D43    10        H         control  2019-06-07    0.3216
2  D42    8         M         stress   2019-06-07    0.2143
3  D42    9         M         stress   2019-06-07    0.1342
4  D21    8         L         stress   2019-06-07    0.3214
...

Я хочу создать линейную диаграмму с полосой ошибок с помощью mse / std, что-то вроде этого:

введите описание изображения здесь

из: https://matplotlib.org/1.2.1/examples/pylab_examples/errorbar_demo.htmlbut в моем случае: по оси X должен быть час, по оси Y - значения и три строки, по одной для каждого уровня обработки (trt_level), поэтому линия для H, M, L.

Для этого я использовал функции groupby и agg:

data = df.groupby(['trt_level','Hour']).agg([np.mean, np.std])
data.head()

>>>                value
                   mean      std
trt_level  Hour   
H           7      0.231      0.0058
            8      0.212      0.0094
            9      0.431      0.1154
...


wwhich предоставил базу данных с treamtnet и часом в качестве индекса, среднего и стандартного значения, но проблема в том, что когда я пытаюсь построить график, я получаю только одну строку без std сверху:

data = data['value'] 
qual.plot(kind = "line", y = "mean", legend = False,  
          xerr = "std", title = "test", color='green')

введите описание изображения здесь

Когда желаемый результат должен состоять из трех строк со стандартным выводом наверху (лучше, если это может быть MES, а не стандартное, но в этом вопросе я больше сосредоточусь на трех строках и отображении стандартного сообщения)

Моя конечная цель - получить диаграмму, которая больше похожа на эту (извините за ужасный рисунок):

введите описание изображения здесь

но на все часы


person Reut    schedule 27.10.2020    source источник


Ответы (1)


Почти там. Вам нужно распаковать мультииндексный фрейм данных.

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

#My test file contained at least two values per condition to calculate an SD value
#df = pd.read_csv("test.txt", sep = "\s{2,}") 

dfm = df.groupby(["trt_level","Hour"]).agg([np.mean, np.std])

dfm["value"].unstack(level=0).plot(y = "mean", yerr = "std", title = "TRT levels are really important!", color = list("rbg"))

plt.show()

Пример вывода

введите описание изображения здесь

Кстати: kind="line" указывать не обязательно, это значение по умолчанию. В документации pandas перечислены все возможные ключевые слова для kind.

person Mr. T    schedule 27.10.2020