Seaborn Facetgrid неправильная ось х - PullRequest
1 голос
/ 12 марта 2019

У меня есть примерно такие данные, представляющие чистый денежный поток на портфель и на какие даты:

import datetime
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.DataFrame({'PORTFOLIO':  ['A', 'A', 'A', 'A','A', 'A', 'A', 'B','B', 'B','B', 'B', 'B', 'B','C'],
               'DATE': ['28-02-2018','28-02-2018','28-02-2018','10-10-2018','10-10-2018','01-12-2018','31-12-2018',
                        '30-09-2018','30-09-2018','30-09-2018','31-12-2018','31-01-2019','28-02-2019','05-03-2019','01-07-2019'],
               'NCF': [ 856000, 900000, 45000, 2005600,43900, 46700, 900000, 7890000, 821000, 95000, 400000, 7000000, 82500,10000000,1525000],
               })
df2=df.groupby(['PORTFOLIO','DATE']).sum().reset_index()
df2

Я группирую его, так как меня интересует только просмотр денежных потоков по дням. enter image description here

Теперь меня интересует визуализация денежного потока в виде гистограммы для портфеля.

sns.set(style='dark', color_codes=True)
g=sns.FacetGrid(df2, col="PORTFOLIO", hue='PORTFOLIO',col_wrap=3, height=5,  sharey=False, sharex=False)


g=g.map(plt.bar,'DATE','NCF')
g.set_xticklabels(rotation=45)
plt.tight_layout()
plt.show()

К сожалению, мультиплоты сетки морского борова дают мне неправильные значения на оси x, независимо от того, что я пытаюсь сделать с набором данных. Это похоже на то, как первый портфель устанавливает значения тиков, а остальные просто должны следовать, даже если даты неверны. enter image description here

Если я удалю g.set_xticklabels(rotation=45) Тогда портфель C получает правильную дату, и кажется, что правильные даты на B скрыты за неправильными датами «A». enter image description here

Порядок корзин меняется, но все равно не корректно (монотонное увеличение по дате).

Что я делаю не так и как я могу это исправить?

1 Ответ

2 голосов
/ 12 марта 2019

Сначала преобразуйте в datetime и сортируйте:

df2.DATE = pd.to_datetime(df2.DATE)
df2 = df2.sort_values(by=['PORTFOLIO', 'DATE'])
df2.DATE = df2.DATE.astype(str)

Вы можете получить доступ к отдельным осям с помощью g.axes (на основе этого ответа ).Итак:

sns.set(style='dark', color_codes=True)
g=sns.FacetGrid(df2, col="PORTFOLIO", hue='PORTFOLIO',col_wrap=3, height=5,  sharey=False, sharex=False)
g=g.map(plt.bar,'DATE','NCF')
g.set_xticklabels(rotation=45)
for idx, v in enumerate(df2.PORTFOLIO.unique()):
    g.axes[idx].set_xticklabels(df2.loc[df2.PORTFOLIO == v, 'DATE'])
plt.tight_layout()
plt.show()

Дает вам:

enter image description here

...