Как сохранить метки seaborn xtick одинаковыми для каждой итерации графика? - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть данные платежа для трех клиентов с указанием месяца и года каждого платежа:

              user_id  amount  Mon_Year
2076273          1664  245.16  Jan-2019
3682561          1664  122.58  Jul-2019
5437947          1664  109.43  Nov-2019
6067277          1664  218.86  Dec-2019
1911317          3396  319.00  Jan-2019
6079810          3396  360.00  Dec-2019
1961388          4192  104.28  Jan-2019
2500575          4192  104.28  Mar-2019
2709024          4192  104.28  Apr-2019
3049894          4192  104.28  May-2019

И я могу создать для каждого клиента график штрафа:

for user in df.user_id.unique():
    temp = df[df['user_id']==user]
    plt.figure(figsize=(15,5))
    ax = sns.barplot(x="Mon_Year", y="amount", data=temp,ci=None)
    ax.set_title(f'transactions for user: {user}')
    ax.set_xticklabels(ax.get_xticklabels(),rotation=30)
    plt.show()

plots

Однако я бы хотел, чтобы на каждом графике были одинаковые символы (все даты в столбце Mon_Year), чтобы графики имели одинаковый масштаб.

График № 2 отсутствует несколько месяцев, поэтому в идеале он должен иметь пустые столбцы. Я смогу немного проще сравнивать клиентов и видеть, в какие месяцы ничего не было потрачено. Вот так:

enter image description here

Я пытался использовать xlim, но полностью сломал его, я думаю, что это работает только для числовых данных, но Mon_Year категоричен.

Для этого примера df диапазон xticks идет с января 2019 по De c 2019:

df.Mon_Year.unique()

array(['Jan-2019', 'Jul-2019', 'Nov-2019', 'Dec-2019', 'Mar-2019',
       'Apr-2019', 'May-2019'], dtype=object)

Обратите внимание, что в df все они предварительно отсортированы в Monthly заказ для каждого клиента.

Как я могу установить xlim для категориальных данных и сохранить его одинаковым для каждой итерации графиков?

Mu sample df:

import pandas as pd
import seaborn as sns

df = pd.DataFrame({'index': pd.Series([2076273, 3682561, 5437947, 6067277, 1911317, 6079810, 1961388, 2500575, 2709024, 3049894],dtype='int64',index=pd.RangeIndex(start=0, stop=10, step=1)), 'user_id': pd.Series(['1664', '1664', '1664', '1664', '3396', '3396', '4192', '4192', '4192', '4192'],dtype='object',index=pd.RangeIndex(start=0, stop=10, step=1)), 'amount': pd.Series([245.16, 122.58, 109.43, 218.86, 319.0, 360.0, 104.28, 104.28, 104.28, 104.28],dtype='float64',index=pd.RangeIndex(start=0, stop=10, step=1)), 'Mon_Year': pd.Series(['Jan-2019', 'Jul-2019', 'Nov-2019', 'Dec-2019', 'Jan-2019', 'Dec-2019', 'Jan-2019', 'Mar-2019', 'Apr-2019', 'May-2019'],dtype='object',index=pd.RangeIndex(start=0, stop=10, step=1))}, index=pd.RangeIndex(start=0, stop=10, step=1))

1 Ответ

1 голос
/ 11 февраля 2020

Я изменил ваш l oop, чтобы добавить все значения месяца-года в кадр данных temp. Это добавит значения NaN для index и amount в новых строках и пустое пространство в результирующем графике.

mon_year = ['Jan-2019', 'Feb-2019', 'Mar-2019', 'Apr-2019', 'May-2019', 'Jun-2019', 'Jul-2019','Aug-2019', 'Sept-2019', 'Oct-2019', 'Nov-2019', 'Dec-2019']

for user in df.user_id.unique():
    temp = df[df['user_id']==user].set_index('Mon_Year')
    temp = temp.reindex(mon_year)
    temp = temp.reset_index()
    plt.figure(figsize=(15,5))
    ax = sns.barplot(x="Mon_Year", y="amount", data=temp,ci=None)
    ax.set_title(f'transactions for user: {user}')
    ax.set_xticklabels(ax.get_xticklabels(),rotation=30)
    plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...