Matplotlib 在 x 轴上的月份名称偏移量

Month name offset in x axis with Matplotlib

我正在使用 pandas、xarray 和 matplotlib 从 .nc 文件中绘制一些时间序列。我有两个数据集:

  1. 1982 年至 2019 年的海面温度,我从中绘制了我所在地区的月平均值,并代表了这 37 年的月温度变化。
  2. 从 2020 年到 2021 年的海面温度,我在其中绘制了每年的月度变化。

两个图,我使用以下代码(请注意,由于内存分配问题,我在遍历变量时遇到了内存分配问题,我写了一个没有循环的非常基本的代码,对此深表歉意!)

import xarray as xr
import matplotlib.pyplot as plt
from matplotlib import dates as md
import pandas as pd
import numpy as np
import netCDF4
import seaborn as sns
import marineHeatWaves as mhw
import datetime
sns.set()

ds_original = xr.open_dataset('sst_med_f81_to21_L4.nc')
ds_original_last = xr.open_dataset('sst_med_f20_to21_L4.nc')

extract_date = datetime.datetime.today()
date = extract_date.strftime("%Y-%m-%d")
ds1 = ds_original.sel(time=slice('1982-01-01','2019-12-31'))
ds2 = ds_original_last.sel(time=slice('2020-01-01','2020-12-31'))
ds3 = ds_original_last.sel(time=slice('2021-01-01', date))

# Convert to Pandas Dataframe
df1 = ds1.to_dataframe().reset_index().set_index('time')
df2 = ds2.to_dataframe().reset_index().set_index('time')
df3 = ds3.to_dataframe().reset_index().set_index('time')

#Converting to Celsius
def kelvin_to_celsius(temp_k):
    """
    Receives temperature in K and returns
    temperature in Cº
    """
    temp_c = temp_k - 273.15
    return temp_c

df1['analysed_sst_C'] = kelvin_to_celsius(df1['analysed_sst'])
df2['analysed_sst_C'] = kelvin_to_celsius(df2['analysed_sst'])
df3['analysed_sst_C'] = kelvin_to_celsius(df3['analysed_sst'])

#Indexing by month and yearday
df1['month'] = df1.index.month
df1['yearday'] = df1.index.dayofyear
df2['month'] = df2.index.month
df2['yearday'] = df2.index.dayofyear
df3['month'] = df3.index.month
df3['yearday'] = df3.index.dayofyear

# Calculating the average
daily_sst_82_19 = df1.analysed_sst_C.groupby(df1.yearday).agg(np.mean)
daily_sst_2020 = df2.analysed_sst_C.groupby(df2.yearday).agg(np.mean)
daily_sst_2021 = df3.analysed_sst_C.groupby(df3.yearday).agg(np.mean)

# Quick Plot
sns.set_theme(style="whitegrid")
fig, ax=plt.subplots(1, 1, figsize=(15, 7))
ax.xaxis.set_major_locator(md.MonthLocator())
ax.xaxis.set_major_formatter(md.DateFormatter('%b'))
ax.margins(x=0)
plt.plot(daily_sst_82_19, label='1982-2019')
plt.plot(daily_sst_2020,label='2020')
plt.plot(daily_sst_2021,label='2021', c = 'black')
plt.legend(loc = 'upper left')

我得到以下情节:

我希望我的情节从一月开始到十二月结束,但我想不出问题在哪里。我试图在特定日期之间设置 x 轴限制,但这会产生冲突,因为时间序列之一是 37 年,而另外两个仅是 1 年。

任何帮助将不胜感激!!

更新

我想出了如何移动月份,具体如下:

ax.xaxis.set_major_locator(MonthLocator(bymonthday=2))

所以我得到了这个:

但我仍然需要删除去年一月的那个,但我不知道该怎么做。

好的,那我想办法解决这个问题了。

微调绘图参数,我将 DateFormatter 切换为 %D,以查看年份。令我惊讶的是,年份被设置为 1970 年,我不知道为什么,因为我最古老的数据集始于 1981 年。所以一旦我发现这一点,我将 xlims 设置为您可以在下面阅读的那些并且它运行良好:

#Add to plot settings:
ax.set_xlim(np.datetime64('1970-01-01'), np.datetime64('1970-12-31'))
ax.xaxis.set_major_locator(MonthLocator(bymonthday=1))
ax.xaxis.set_major_formatter(md.DateFormatter('%b'))

结果: