【问题标题】:Settings for timedata in seaborn FacetGrid plotsseaborn FacetGrid 图中时间数据的设置
【发布时间】:2016-12-31 06:22:46
【问题描述】:

我想每月绘制数据并每年显示一次年份标签。 这是数据:

timedates = ['2013-01-01', '2013-02-01', '2013-03-01', '2013-04-01', '2013-05-01', '2013-06-01', '2013-07-01', 
         '2013-08-01', '2013-09-01', '2013-10-01', '2013-11-01', '2013-12-01', '2014-01-01', '2014-02-01', 
         '2014-03-01', '2014-04-01', '2014-05-01', '2014-06-01', '2014-07-01', '2014-08-01', '2014-09-01', 
         '2014-10-01', '2014-11-01', '2014-12-01']

timedates = pd.to_datetime(timedates)

amount = [38870, 42501, 44855, 44504, 41194, 42087, 43687, 42347, 45098, 43783, 47275, 49767, 
      39502, 35951, 47059, 47639, 44236, 40826, 46087, 41462, 38384, 41452, 36811, 37943]

types = ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 
     'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C']

df_x = pd.DataFrame({'timedates': timedates, 'amount': amount, 'types': types})

我发现了如何用 matplotlib 做到这一点

plt.style.use('ggplot')

fig, ax = plt.subplots()
ax.plot_date(df_x.timedates, df_x.amount, 'v-')
ax.xaxis.set_minor_locator(md.MonthLocator()) 
ax.xaxis.set_minor_formatter(md.DateFormatter('%m'))

ax.xaxis.grid(True, which="minor")
ax.yaxis.grid()

ax.xaxis.set_major_locator(md.YearLocator())
ax.xaxis.set_major_formatter(md.DateFormatter('\n\n%Y'))
plt.show()

现在我转向 seaborn 以考虑不同类型的数据。是否可以使用 seaborn FacetGrid 获得相同样式的刻度?

g = sns.FacetGrid(df_x, hue='types', size=8, aspect=1.5)
g.map(sns.pointplot, 'timedates', 'amount')
plt.show()

当我尝试应用刻度格式时 - 它们就消失了。

【问题讨论】:

  • 你看到这个stackoverflow.com/questions/31810316/…github.com/mwaskom/seaborn/issues/498。听起来像是 Pandas/Seaborne 和 matplotlib 之间的标签和日期不兼容。您可以手动使用g.ax.set_xticks([dates, in, format, you, want]) 解决...
  • @EdSmith 是的,我看到了第一个链接,但没有答案。并感谢第二个和代码,我会检查是否可以这样做。
  • 可以对g进行迭代,例如:for ax in g.axes.flat: ax.xaxis.set_major_locator(ticker.MultipleLocator(6))

标签: python matplotlib plot time-series seaborn


【解决方案1】:

您可以将xticks 格式化为仅包含datetime 对象的monthyear,并获得一个pointplotxticks,对应于散点图的位置。

df['timedates'] = df['timedates'].map(lambda x: x.strftime('%Y-%m'))


def plot(x, y, data=None, label=None, **kwargs):
    sns.pointplot(x, y, data=data, label=label, **kwargs)

g = sns.FacetGrid(df, hue='types', size=8, aspect=1.5)
g.map_dataframe(plot, 'timedates', 'amount')
plt.show()

【讨论】:

  • 非常感谢!这不是我最初想要的,但它可以是一个解决方案!如果没有太多数据周期:)
  • 另外,如果您想使用pandas 绘制大型数据集,您可以使用x_compat=True 来抑制xticks 的重叠行为。
【解决方案2】:

到目前为止,我是手动完成的。只需按类型分隔线并将它们绘制在一起。

改变了这一行

ax.plot_date(df_x.timedates, df_x.amount, 'v-')

分成三个情节线:

types_levels = df_x.types.unique()

for i in types_levels:
    ax.plot_date(df_x[df_x.types==i].timedates, df_x[df_x.types==i].amount, 'v-')

plt.legend(types_levels)

虽然不是答案,但我不能使用 seaborn FacetGrid 的其他优势。

【讨论】:

    【解决方案3】:

    您可以使用与 matplotlib 相同的代码!

    for ax in g.axes.flat:
         # Paste in your own code!
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 2017-09-29
      • 1970-01-01
      • 2015-11-14
      • 2018-02-01
      • 2020-06-17
      相关资源
      最近更新 更多