2010年3月6日土曜日

エルニーニョ: NINO監視領域の温度偏差



寒暖の差大きく、大雪も 12~2月、気象庁まとめ (日経新聞)
気象庁は1日、この冬(昨年12月~今年2月)の天候まとめを発表した。3カ月間の平均気温は全国的に高めとなったものの、暖冬をもたらす「エルニーニョ現象」と北極域の気圧が高くなる「北極振動」の影響で、例年以上に寒暖の差が大きくなった。  気象庁によると、今冬はエルニーニョ現象の影響で西高東低の冬型の気圧配置が長続きせず、平均気温は西日本で平年より1.0度、東日本で0.9度、北日本と沖縄・奄美は0.6度高くなった。  季節外れの暖かさとなったのは1月下旬と2月下旬で、2月25日には全国約160カ所で、2月の最高気温の記録を更新した。(01日 19:53)
エルニーニョを話題とする。エルニーニョを監視するために、東太平洋のエルニーニョ監視領域の海面温度がよく使われる。エルニーニョ監視領域
エルニーニョ監視領域の温度とその平年値からの偏差(anomaly)のデータはNOAAのclimate predictionセンターから手に入るここの情報によれば、平年値は1971年から2000年までの平均で定義される。

以下は、これらのエルニーニョ監視領域の絶対値と偏差をネットから取得するモジュールと、4つの監視領域の偏差をデータ全期間もしくは過去48ヶ月分プロットするプログラムである。今回は正で赤、負で青で塗り分けるために、matplotlibのfill_betweenを使った。

NINO_all.png
 
NINO_48months.png
read_NINO.py
import numpy as np
import scikits.timeseries as ts

def read_NINO():
    """
    output output NINO index data
    data souce is http://www.cpc.ncep.noaa.gov/data/indices/sstoi.indices
    Explanation is http://www.cpc.ncep.noaa.gov/data/indices/
    usage:  from read_NINO import read_NINO 
            data=read_NINO()
    outputs are     
    data["NINO1+2"]     : NINO1+2  
    data["NINO1+2 ANOM"]: NINO1+2 ANOMARY  
    data["NINO3"]       : NINO3
    data["NINO3 ANOM"]  : NINO3 ANOMALY
    data["NINO4"]       : NINO4
    data["NINO4 ANOM"]  : NINO4 ANOMALY
    data["NINO3.4"]     : NINO3.4
    data["NINO3.4 ANOM"]: NINO3.4 ANOMALY  
    """  
    ninodata={}
    names=('YEAR','MONTH','NINO1+2','NINO1+2 ANOM','NINO3','NINO3 ANOM','NINO4','NINO4 ANOM','NINO3.4','NINO3.4 ANOM')
    ds = np.DataSource(None)
    f=ds.open('http://www.cpc.ncep.noaa.gov/data/indices/sstoi.indices')
    data=np.loadtxt(f,skiprows=1,\
         dtype={'formats':('i4','i4','f4','f4','f4','f4','f4','f4','f4','f4'),\
                'names': names})
    firstday=ts.Date(freq='M',year=data['YEAR'][0],month=data['MONTH'][0])
    for n in names[2:]:
          ninodata[n]=ts.time_series(data[n],start_date=firstday,freq='M')
    return ninodata

#######################################################################

if __name__ == '__main__':
    import matplotlib.pyplot as plt
    import matplotlib.dates as mdates

    data=read_NINO()

#plot
    for nt in range(2):
        temp=data['NINO3'].dates # dummy to get dates of time series

        if nt==0:   # all data
            t=ts.date_array(start_date=temp[0],end_date=temp[-1])
            figname="NINO_all.png"
        else:       # last 48 months
            t=ts.date_array(start_date=temp[-1]-47,end_date=temp[-1])
            figname="NINO_48months.png"

        fig=plt.figure() 
        names=('NINO1+2 ANOM','NINO3 ANOM','NINO4 ANOM','NINO3.4 ANOM')
        for n,name in enumerate(names):
            x=(data[name])[t].dates.tolist()
            y=(data[name])[t].series
            ax=fig.add_subplot(len(names),1,n+1)
            ax.plot(x,y,'k-')
            ax.fill_between(x,y1=y,y2=0,facecolor='red',where=y>=0)  #positive red
            ax.fill_between(x,y1=y,y2=0,facecolor='blue',where=y<=0)  #positive red
            if (nt==0): # axis for all data 
                years    = mdates.YearLocator(5) #major tick every 5 years 
                ax.xaxis.set_major_locator(years)
            else:       # axis for latst 48 months
                years    = mdates.YearLocator(1) #major tick every 1 year
                ax.xaxis.set_major_locator(years)
                months    = mdates.MonthLocator() # minor tick every month
                ax.xaxis.set_minor_locator(months) 
            plt.title(name)                  #tile
        plt.subplots_adjust(hspace=0.5)             #adjust subplot scape 
        plt.savefig(figname)
        plt.show()

0 件のコメント: