如何在matplotlib中使用年-月作为记号设置x轴?

如何在matplotlib中使用年-月作为记号设置x轴?,matplotlib,Matplotlib,我有一个来自netcdf文件的二维变量XVAR,维度为[年,月]。我想绘制平坦的XVAR(长度为nyear*nmonth的1D数组),并将x轴设置为:主刻度上的年份,次刻度上的月份。困难在于我不知道如何每月创建一个1d数组。没有我可以使用的monthdelta方法(尽管我知道原因是每个月有不同的天数) 在三角洲=?在下面的步骤中,我尝试了delta=relativedelta.relativedelta(months=1),但得到了一个错误“object没有属性‘total_seconds’”,

我有一个来自netcdf文件的二维变量XVAR,维度为[年,月]。我想绘制平坦的XVAR(长度为nyear*nmonth的1D数组),并将x轴设置为:主刻度上的年份,次刻度上的月份。困难在于我不知道如何每月创建一个1d数组。没有我可以使用的monthdelta方法(尽管我知道原因是每个月有不同的天数)

在三角洲=?在下面的步骤中,我尝试了delta=relativedelta.relativedelta(months=1),但得到了一个错误“object没有属性‘total_seconds’”,我不完全理解这个错误

import numpy as np
from netCDF4 import Dataset
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from mpl_toolkits.basemap import Basemap
from datetime import date, timedelta

ncfile = Dataset('filepath',mode='r')
XVAR4d = ncfile.variables['XVAR'][:]
XVAR2d = np.nanmean(XVAR4d,axis=(2,3)).flatten()
yrs = ncfile.variables['YEAR']

stt = date(np.min(yrs),1,1)
end = date(np.max(yrs)+1,1,1)
delta = ?
dates = mdates.drange(stt,end,delta)

years = mdates.YearLocator()   # every year
months = mdates.MonthLocator()  # every month   
yearsFmt = mdates.DateFormatter('%Y')

fig = plt.figure()
ax1 = fig.add_subplot(211)
ax1.xaxis.set_major_locator(years)
ax1.xaxis.set_major_formatter(yearsFmt)
ax1.xaxis.set_minor_locator(months)
ax1.set_xlim(stt,end)
ax1.plot(dates,xvar2d,c='r')

我决定我确实喜欢我第二次评论的想法,所以我把它变成了一个实际的建议答案

不要使用
drange
,而是自己创建日期:

totalMonths = 12*(np.max(yrs) - np.min(yrs)+1)
dates = mdates.date2num([date(np.min(yrs)+(i//12),i%12+1,1) for i in range(totalMonths)])

看起来像是
drange
采用
datetime.timedelta
。对于30天的增量,请尝试
delta=datetime.timedelta(30)
。诚然,我不确定matplotlib如何处理月份,因为每个月的天数不同。也许最好设置自己的范围。可能是这样的:
dates=mdates.date2num([date(np.min(yrs)+(i/12),i%12+1,1)表示i在范围内(12*(np.max(yrs)-np.min(yrs)+1))
?谢谢!只要一次更正。
i/12
中的真除法返回浮点,并导致错误。根据,我将其改为楼层分区:
I//12
。很高兴知道这一点。我通常使用Python2.x,但一直在向3移植更多代码,我一定要记住这一点!