更改 Seaborn barplot 中的 x 轴日期时间限制

问题描述 投票:0回答:1

我正在尝试在 Seaborn 中制作条形图,但我正在努力设置 x 轴限制。我有设定范围的数据,但我想将 x 轴限制设置为比该范围更大的范围!当我尝试设置 x 轴限制时,整个图消失了!这是一个可重复的小例子。创建数据框:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
df = pd.Series([np.random.normal()**2 for x in range(7)], 
        pd.date_range(start = "2024-01-01", end = "2024-01-07"))

并尝试创建条形图:

import matplotlib.dates as mdates
date_rng = pd.date_range(start = "2024-01-01", end = "2024-01-10")

date_range_mpl = mdates.date2num(date_rng)
x_vals = mdates.date2num(df.index)

fig, ax = plt.subplots(figsize = (8,4))
sns.barplot(x = x_vals, y = df.values, ax = ax)
ax.set_xlim(date_range_mpl[0] - 1, date_range_mpl[-1] + 1)

当尝试设置 x 轴限制时,绘图在最后一行中断。

使用

mdates.date2num
函数的原因是,显然 Seaborn 与 pandas 日期时间对象不兼容,因此建议我首先将这些对象转换为 matplotlib 的日期时间对象(只是浮点数)。我不明白为什么这不起作用!任何帮助将不胜感激,谢谢。

编辑:为了展示我的目标,请参阅以下非seaborn示例:

from datetime import timedelta
date_rng = pd.date_range(start = "2024-01-01", end = "2024-01-10")
fig, ax_al = plt.subplots(figsize = (8,4))

plt.bar(x = df.index, height = df.values)
ax_al.set_xlim([date_rng[0] - timedelta(days = 1), date_rng[-1] + timedelta(days = 1)])
python pandas matplotlib datetime seaborn
1个回答
0
投票

条形图的 x 值是从 0 开始的整数。

一种方法是

df.reindex()
,例如:

date_rng = (date_rng.union(date_rng + 1 * date_rng.freq)
                    .union(date_rng - 1 * date_rng.freq))

fig, ax = plt.subplots(figsize = (8,4))
sns.barplot(df.reindex(date_rng), ax=ax)
fig.autofmt_xdate()

输出:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.