Python Seaborn FaceGrid x轴不正确

Python Seaborn FaceGrid x轴不正确,python,pandas,dataframe,matplotlib,facet-grid,Python,Pandas,Dataframe,Matplotlib,Facet Grid,我有类似的数据,显示每个投资组合的净现金流,以及日期: 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': ['

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

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 FaceGrid multiplots在x轴上给了我错误的值,无论我如何处理数据集。这就像第一个投资组合设定了刻度值,而其余的投资组合即使日期不正确也必须跟随。

如果我删除
g.set\u xticklabels(rotation=45)
然后投资组合C得到了正确的日期,而B上的正确日期似乎隐藏在错误的“A”日期后面。

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


我做错了什么,如何解决这个问题?

首先转换为
datetime
并排序:

df2.DATE = pd.to_datetime(df2.DATE)
df2 = df2.sort_values(by=['PORTFOLIO', 'DATE'])
df2.DATE = df2.DATE.astype(str)
您可以使用
g.axes
(基于)访问各个轴。因此:

给你:


你能详细说明一下想要的结果是什么吗?@Julia,我想在橙色和绿色的条形图中看到正确的日期。例如,投资组合“C”在7月1日只有一个现金流,而不是条形图上显示的12月1日。谢谢您的回答。不幸的是,我不认为这会起作用,因为我的多点图每天都会变化,这意味着有一天我会看一个图,其他日子我可能不得不看10个图。所以,我猜不能像这样硬编码。我改变了一点,也许这对我有帮助,或者这个“修复”不再起作用了。我每天在生产中运行的代码突然又开始显示疯狂的x轴。我想我可能已经仔细检查了代码,但从这篇文章开始就没碰过它。我想我会看看这篇文章,但看到你的答案不再“解决”这个问题,我感到非常惊讶。Seaborne中是否有“破坏”您修复的更新?或者几天前matplotlib的更新??我很困惑,…嘿,海蒂,我刚刚重新测试了我的设置(熊猫0.24.2,matplotlib 3.0.2,seaborn 0.9.0),看起来还可以。此外,库中的升级不会影响您,只要您不安装它。也许有什么改变了?嘿,你说的日期不符合顺序是对的。事实上,在我最初的回答中,它们也有问题!您可以通过首先转换为
datetime
,排序,然后再转换回string来修复此问题(最后一位不是严格必需的,但您确实是从string开始的,而seaborn则会给出奇怪的结果)。我将在我的答案中添加这一行。我希望这是清楚的,如果你不想问的话
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()