Hun*_*ter 1 python datetime matplotlib pandas seaborn
我目前正在使用 Seaborn 和 Pandas 来可视化数据集。我有一些与时间相关的数据,我想用条形图绘制它们。
然而,我在 Seaborn 中遇到了两个问题:
我在正常的 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 轴日期?
不可以,您不能seaborn.barplot与勾选一起使用matplotlib.dates。原因是 seaborn 条形图的刻度位于整数位置 (0,1,..., N-1)。因此它们不能被解释为日期。
您有三个选择:
matplotlib.dates。python 3.10, pandas 1.5.0, matplotlib 3.5.2,seaborn 0.12.0N = 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)