2017-04-03 6 views
0

私は次元[年、月]を持つnetcdfファイルから2D変数XVARを持っています。私はフラット化されたXVAR(長さnyear * nmonthの1D配列)をプロットし、x軸を次のように設定したい:主要なティックの年とマイナーティックの月。難しいのは、毎月のステップで1dアレイを作成する方法を知らないことです。私が使用できるmonthdeltaメソッドはありません(ただし、毎月の日数が異なるため理由が分かります)。matplotlibの年月をティックマークとして使用してx軸を設定する方法は?

デルタ=ですか?デルタ= relativedelta.relativedelta(月= 1)を試しましたが、「オブジェクトに属性「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

が見えます。 30日分のデルタについては、 'delta = datetime.timedelta(30)'を試してください。私は、毎月は異なる日数なので、matplotlibがどのように月を扱うのかは間違いありません。 –

+0

おそらく、独自の範囲を設定するのが最善でしょう。範囲内のi(12 *(np.max(yrs) - )の 'dates = mdates.date2num([date(np.min(yrs)+(i/12)、i%12 + 1,1) np.min(yrs)+1))]) '? –

答えて

0

私は2番目のコメントのアイデアが気に入ったので、実際の提案された回答に変えています。

代わりのdrangeを使用して、日付を自分で作成します。drange`は `datetime.timedelta`を取る`よう

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'の真の除算はfloatを返し、エラーを引き起こします。 [PEP 238 - ディビジョン演算子の変更](https://www.python.org/dev/peps/pep-0238/)に従って、私はそれをフロア区画「i // 12」に変更しました。 – Xin

+0

これは知っておきたいことです。私は典型的にはPython 2.xですが、より多くのコードを3に移植しています。これを念頭に置いておく必要があります。 –

関連する問題