Seaborn Facetgrid 不正确的 x 轴

Seaborn Facetgrid incorrect x axis

我有类似这样的数据,显示了每个投资组合的净现金流量,以及日期:

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

我将其分组,因为我只对每天的现金流量感兴趣。

现在我有兴趣在每个投资组合的条形图中可视化现金流量。

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()

不幸的是,seaborn facetgrid multiplots 在 x 轴上给了我不正确的值,无论我尝试对数据集做什么。这就像第一个投资组合设置了分时值,即使日期不正确,其余的也必须遵循。

如果我删除 g.set_xticklabels(rotation=45) 然后投资组合 C 获得了正确的日期,而 B 上的正确日期似乎隐藏在不正确的 'A' 日期之后。

bin 的顺序发生变化,但仍然不正确(按日期单调递增)。

我哪里做错了,我该如何解决?

首先转换为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()

给你: