Seaborn 条形图和 X 轴上的日期格式

Hun*_*ter 1 python datetime matplotlib pandas seaborn

我目前正在使用 Seaborn 和 Pandas 来可视化数据集。我有一些与时间相关的数据,我想用条形图绘制它们。

然而,我在 Seaborn 中遇到了两个问题:

  1. 设置 x 轴上日期的格式
  2. 仅显示少数日期(因为在 6 个月图表上标记每一天是没有意义的)

我在正常的 Matplotlib 中找到了解决问题的方法,即:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np

N = 20
np.random.seed(2022)
dates = pd.date_range('1/1/2014', periods=N, freq='m')
df = pd.DataFrame(
    data={'dt':dates, 'val': np.random.randn(N)}
)

fig, ax = plt.subplots(figsize=(10, 6))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
ax.bar(df['dt'], df['val'], width=25, align='center')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

然而,我已经在 Seaborn 中完成了大部分图表,并且我希望保持一致。一旦我将之前的代码转换为 Seaborn,我就失去了格式化日期的能力:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np

N = 20
np.random.seed(2022)
dates = pd.date_range('1/1/2014', periods=N, freq='m')
df = pd.DataFrame(
    data={'dt':dates, 'val': np.random.randn(N)}
)

fig, ax = plt.subplots(1,1)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%y-%m'))
sns.barplot(x='dt', y='val', data=df)
fig.autofmt_xdate()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

当我运行代码时,日期格式保持不变,并且我无法使用 DateLocator 找到任何日期。

有没有什么方法可以让我在 Seaborn 中以类似于 Matplotlib 的 DateLocator 和 DateFormatter 的方式格式化我的 X 轴日期?

Imp*_*est 5

不可以,您不能seaborn.barplot与勾选一起使用matplotlib.dates。原因是 seaborn 条形图的刻度位于整数位置 (0,1,..., N-1)。因此它们不能被解释为日期。

您有三个选择:

  1. 使用seaborn,循环浏览标签并将它们设置为您想要的任何内容
  2. 不使用seaborn,并且具有可用的股票代码的优点(和缺点)matplotlib.dates
  3. 在绘图之前更改数据框中的格式。
  • 测试于python 3.10, pandas 1.5.0, matplotlib 3.5.2,seaborn 0.12.0
N = 20
np.random.seed(2022)
dates = pd.date_range('1/1/2014', periods=N, freq='m')
df = pd.DataFrame(data={'dates': dates, 'val': np.random.randn(N)})

# change the datetime format in the dataframe prior to plotting
df.dates = df.dates.dt.strftime('%Y-%m')

fig, ax = plt.subplots(1,1)
sns.barplot(x='dates', y='val', data=df)

xticks = ax.get_xticks()
xticklabels = [x.get_text() for x in ax.get_xticklabels()]

_ = ax.set_xticks(xticks, xticklabels, rotation=90)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

N = 20
np.random.seed(2022)
dates = pd.date_range('1/1/2014', periods=N, freq='m')
df = pd.DataFrame(data={'dates': dates, 'val': np.random.randn(N)})

df.dates = df.dates.dt.strftime('%Y-%m')
fig, ax = plt.subplots(figsize=(10, 6))
sns.barplot(x='dates', y='val', data=df)

xticks = ax.get_xticks()
xticklabels = [x.get_text() if not i%2 == 0 else '' for i, x in enumerate(ax.get_xticklabels())]

_ = ax.set_xticks(xticks, xticklabels)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述