matplotlib 时间作为非连续时间的x轴(作为cftime.DatetimeProlepticGregorian)

j2cgzkjk  于 2023-10-24  发布在  Go
关注(0)|答案(1)|浏览(115)

我需要在x轴上画出年份。我的时间数组看起来像

array([cftime.DatetimeProlepticGregorian(2002, 8, 1, 0, 0, 0, 0, has_year_zero=True),
       cftime.DatetimeProlepticGregorian(2002, 8, 2, 0, 0, 0, 0, has_year_zero=True),
       cftime.DatetimeProlepticGregorian(2002, 8, 3, 0, 0, 0, 0, has_year_zero=True),
       ...,
       cftime.DatetimeProlepticGregorian(2022, 10, 29, 0, 0, 0, 0, has_year_zero=True),
       cftime.DatetimeProlepticGregorian(2022, 10, 30, 0, 0, 0, 0, has_year_zero=True),
       cftime.DatetimeProlepticGregorian(2022, 10, 31, 0, 0, 0, 0, has_year_zero=True)],
      dtype=object)

当我绘图时:

df = pd.DataFrame({"Date": date_time.astype(str),
                   "Value": values})
fig, ax = plt.subplots(1,1,figsize=(15,3))
#df.Date.astype(str)
plt.set_loglevel('WARNING')
ax.plot(df.Date, df.Value, linestyle='dotted')
ax.xaxis.set_major_locator(YearLocator(1, month=1, day=5))  # Tick locator #, day=10

我得到1
但是,我只想在x轴上显示年份。
我尝试的是,将日期时间转换为pandas索引,然后转换为数值

year = pd.DatetimeIndex(date_time).year
dt = pd.to_numeric(year)

而我得到

发生这种情况是因为,我的数据只使用3个月作为连续数组,而不是全年,但我希望这3个月看起来每年都是连续的。也就是说,由于数据是不连续的,我无法设置/使用pd.date_range(start = '2002-08- 01',end = '2022-08- 23',freq = 'D'),数组的长度变为7397,而我的是1900(因为它只使用3个月的数据)。我如何自定义Pandas的时间索引只是八月,九月,十月和循环,以获得一个连续的数组图?
总而言之,我希望在顶部图像中的图看起来像是一个日常的图,而x轴只作为年份,这样它就可以容纳更多的年份来可视化。
任何帮助将高度赞赏非常感谢
更新1:在完成@matt的建议后,它在x轴上回答了年份,但由于数据有中断并且只使用了几个月,因此图像看起来像3

pqwbnv8z

pqwbnv8z1#

例如,在this answer中,我认为您需要更改的只是切换

ax.xaxis.set_major_locator(YearLocator(1, month=1, day=5))

为:

from matplotlib.dates import YearLocator, DateFormatter

...

ax.xaxis.set_major_locator(YearLocator(1))
ax.xaxis.set_major_formatter(DateFormatter("%Y"))

也就是说,只需要将年份定位器指定为每年,并将日期的格式设置为只显示年份。

  • 更新 *:

如果图中的日期从1970年开始有问题,那么可以将date_time.astype(str) Package 在pd.to_datetime()中,例如,

df = pd.DataFrame(
    {
        "Date": pd.to_datetime(date_time.astype(str)),
        "Value": values,
    }
)

相关问题