Построение временных рядов с использованием Seaborn FacetGrid

У меня есть DataFrame (data) с простым целочисленным индексом и 5 столбцами. Столбцы: Date, Country, AgeGroup, Gender, Stat. (Имена изменены, чтобы защитить невиновных.) Я хотел бы создать FacetGrid, где Country определяет строку, AgeGroup определяет столбец, а Gender определяет оттенок. Для каждой из этих деталей я хотел бы создать график временных рядов. т.е. Я должен получить массив графиков, каждый из которых имеет 2 временных ряда (1 мужчина, 1 женщина). Я могу быть очень близок с:

g = sns.FacetGrid(data, row='Country', col='AgeGroup', hue='Gender')
g.map(plt.plot, 'Stat')

Однако это просто дает мне номер образца по оси x, а не даты. Есть ли быстрое решение в этом контексте.

В более общем плане я понимаю, что подход с FacetGrid состоит в том, чтобы создать сетку, а затем map функцию построения графика. Если бы я хотел создать свою собственную функцию построения графиков, каким соглашениям она должна следовать? В частности, как я могу написать свою собственную функцию построения графика (для перехода к map для FacetGrid), которая принимает несколько столбцов данных из моего набора данных?


person 8one6    schedule 06.09.2014    source источник
comment
Когда вы говорите, что это просто дает мне номер выборки по оси x, а не даты, неясно, откуда должны браться даты. Это другой столбец в вашем фрейме данных?   -  person mwaskom    schedule 06.09.2014
comment
Да, см. выше, есть столбец с именем Date, и я хотел бы использовать его для создания осмысленных отметок по оси X.   -  person 8one6    schedule 06.09.2014


Ответы (1)


Сначала я отвечу на ваш более общий вопрос. Правила для функций, которые вы можете передать FacetGrid.map:

  • Они должны принимать массивоподобные входные данные в качестве позиционных аргументов, причем первый аргумент соответствует оси x, а второй аргумент соответствует оси y (хотя о втором условии подробнее чуть позже).
  • Они также должны принимать два аргумента ключевого слова: color и label. Если вы хотите использовать переменную hue, то они должны быть переданы базовой функции построения графика, хотя вы можете просто поймать **kwargs и ничего с ними не делать, если это не имеет отношения к конкретному графику, который вы делаете.
  • При вызове они должны рисовать график на «активных в данный момент» осях matplotlib.

Могут быть случаи, когда ваша функция рисует график, который выглядит правильно, без ввода x, y, позиционных входных данных. Я думаю, что это в основном то, что здесь происходит с тем, как вы используете plt.plot. Это может быть проще, чем просто вызвать, например, g.set_axis_labels("Date", "Stat") после того, как вы используете map, что правильно переименует ваши оси. Вы также можете сделать g.set(xticklabels=dates), чтобы получить более значимые тики.

Существует также более общая функция FacetGrid.map_dataframe. Правила здесь аналогичны, но функция, которую вы передаете, должна принимать входные данные кадра данных в параметре с именем data, и вместо того, чтобы принимать позиционные входные данные, подобные массиву, она принимает строки, соответствующие переменным в этом кадре данных. На каждой итерации через фасеты функция будет вызываться с входным фреймом данных, замаскированным только значениями для этой комбинации уровней row, col и hue.

Итак, в вашем конкретном случае вам нужно написать функцию, которую мы можем вызвать plot_by_date, которая должна выглядеть примерно так:

def plot_by_date(x, y, color=None, label=None):

    ...

(Я был бы более полезен в теле, но на самом деле я не знаю, как много делать с датами и matplotlib). Конечным результатом является то, что когда вы вызываете эту функцию, она должна отображать текущие активные оси. Тогда сделайте

g.map(plot_by_date, "Date", "Stat")

И это должно сработать, я думаю.

person mwaskom    schedule 06.09.2014
comment
Я имел в виду, что если я хочу свернуть свою собственную функцию, что она должна вернуть? т.е. скажем, я хочу сделать глупую функцию, которая просто рисует горизонтальную линию в каждом аспекте в точке y=2 и игнорирует все входные данные. Тогда как будет выглядеть эта функция? - person 8one6; 06.09.2014
comment
Ах, возвращаемое значение игнорируется.... важно то, что функция строит графики. На самом деле для этого конкретного примера вы можете просто сделать g.map(plt.axhline, y=2). Не уверен, что это поможет вашему общему пониманию. - person mwaskom; 06.09.2014
comment
Я немного поиграю с этим. Я немного увлекся, избегая простого построения сюжета, вместо этого предпочитая делать такие вещи, как ax.plot или df.plot(ax=ax), чтобы четко указать, где я хочу, чтобы художники выполняли свою работу. Так что это немного против зерна для меня. Но я попробую. - person 8one6; 08.09.2014
comment
Это может быть полезно: nbviewer.ipython.org/gist/mwaskom/9276378379d757fe0cc6 - person mwaskom; 08.09.2014