2017-04-03 76 views
0

我有一個netcdf文件的二維變量XVAR,尺寸爲[年,月]。我想繪製平坦的XVAR(1D陣列,長度爲n *年),並設置x軸爲:主要蜱的年數,以及次要蜱的月數。難點是我不知道如何在每月一步創建一個1d陣列。沒有monthdelta方法可以使用(儘管我明白原因是因爲每個月都有不同的天數)。如何在matplotlib中使用年份作爲tickmarks來設置x軸?

在delta =?下面的步驟中,我嘗試了delta = relativedelta.relativedelta(months = 1),但得到了一個錯誤「object has no attribute'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') 
+0

看起來像'drange'需要'datetime.timedelta'。嘗試'delta = datetime.timedelta(30)'獲得30天的增量。我承認不確定matplotlib如何處理月份,因爲每個月都是不同的天數。 –

+0

也許最好設置你自己的範圍。可能類似於:'date = mdates.date2num([date(np.min(yrs)+(i/12),i%12 + 1,1)for i in range(12 *(np.max(yrs) - np.min(年)+1))])'? –

回答

0

我決定我不喜歡我的第二個評論的想法,所以我把它變成一個實際提出答案。

而不是使用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)]) 
+0

謝謝它的作品!只是一個更正。 'i/12'中的真分區返回浮點數,並導致錯誤。根據[PEP 238 - 更改部門操作員](https://www.python.org/dev/peps/pep-0238/),我將其更改爲地板部門:'i // 12'。 – Xin

+0

這是很好的知道。我通常使用Python 2.x,但已經將更多代碼移植到3,我一定要牢記這一點! –