【问题标题】:Seaborn Facetgrid incorrect x axisSeaborn Facetgrid x 轴不正确
【发布时间】:2019-08-02 23:34:53
【问题描述】:

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

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”日期后面。

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

我做错了什么,我该如何解决?

【问题讨论】:

  • 能否请您详细说明想要的结果是什么?
  • @Julia,我想在橙色和绿色条形图中的条形下方看到正确的日期。例如,投资组合“C”在 7 月 1 日只有一个现金流,而不是在条形图中显示的 12 月 1 日。

标签: python pandas dataframe matplotlib facet-grid


【解决方案1】:

先转换为datetime并排序:

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

您可以使用g.axes(基于this answer)访问各个轴。所以:

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

给你:

【讨论】:

  • 感谢您的回答。不幸的是,我认为这不会奏效,因为我的多重情节每天都会有所不同,这意味着有一天我会看 1 个情节,而其他日子我可能不得不看 10 个情节。所以不能像这样硬编码,我猜。
  • 我稍微改了一下,也许有帮助
  • 是我,还是这个“修复”不再起作用了。我每天在生产中运行的代码突然开始再次显示疯狂的 x 轴。我想我可能已经整理了代码,但自从这篇文章以来就没有碰过它。我以为我会查看这篇文章,但很惊讶地看到您的答案不再“解决”问题。 Seaborne 中的更新是否会“破坏”您的修复?或者也许几天前的matplotlib更新?我很困惑,..
  • 嘿 Heidi,我刚刚重新测试了我的设置(pandas 0.24.2、matplotlib 3.0.2、seaborn 0.9.0),看起来还不错。此外,只要您不安装库,升级就不会影响您。也许还有其他变化?
  • 嘿,你说得对,日期有问题。事实上,他们在我原来的答案中也出现了问题!您可以通过首先转换为datetime,排序,然后转换回字符串来解决此问题(最后一点不是绝对必要的,但您确实从字符串开始,否则 seaborn 会给出奇怪的结果)。我将在我的答案中添加执行此操作的行。我希望这很清楚,如果不能随意询问。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 2020-12-21
  • 2018-03-24
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
相关资源
最近更新 更多