<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4918390655818864374</id><updated>2012-02-17T04:53:31.185+09:00</updated><category term='数値計算'/><category term='data'/><category term='cdat'/><category term='grads'/><category term='f2py'/><category term='signal processing'/><category term='Sage'/><category term='R'/><title type='text'>Ocean Science Hack</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>62</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-8918622148302217939</id><published>2012-02-06T16:48:00.001+09:00</published><updated>2012-02-06T16:49:44.463+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grads'/><title type='text'>GrADSで作成するpostscriptの不要な横線</title><content type='html'>GrADSでpostscript形式の図を作ると不要な横線が入ってしまうことがある。&lt;br /&gt;&lt;br /&gt;従来の対策は、例えば&lt;br /&gt;http://www.sci.hokudai.ac.jp/~sasakiyo/tips_grads.html&lt;br /&gt;&lt;br /&gt;GrADS 2.0.0から従来のgxout shaded に加えて、gxout shade2が加わっている。&lt;br /&gt;http://www.iges.org/grads/gadoc/gradcomdsetgxout.html&lt;br /&gt;これで図を作ったところ、従来横線が入っていた場合に、横線が入らなくなった。常にそうであるかは要確認。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-8918622148302217939?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/8918622148302217939/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=8918622148302217939' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/8918622148302217939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/8918622148302217939'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2012/02/gradspostscript.html' title='GrADSで作成するpostscriptの不要な横線'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-75066412554318520</id><published>2011-10-17T08:51:00.002+09:00</published><updated>2011-10-18T00:10:46.658+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='signal processing'/><title type='text'>フィルタの応答関数</title><content type='html'>フィルタの周波数応答関数をプロットしてみる。&lt;br /&gt;&lt;br /&gt;以下の例は、&lt;a href="http://www.kumst.kyoto-u.ac.jp/kougi/time_series/"&gt;京都大学の講義「MATLABで時系列解析」&lt;/a&gt;の&lt;a href="http://www.kumst.kyoto-u.ac.jp/kougi/time_series/ex1030.html"&gt;線形システムの伝達関数を求める&lt;/a&gt;を翻案したものである。&lt;br /&gt;&lt;br /&gt;想定としては、1ヶ月ずつのデータがあり、シグナルとしては、48ヶ月周期と6ヶ月周期とホワイトノイズが重なったシグナルに対して13ヶ月の移動平均をかけている。&lt;br /&gt;&lt;br /&gt;理論的な周波数応答関数を求める関数は&lt;a href="http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.freqz.html#scipy.signal.freqz"&gt;scipyのfreqz&lt;/a&gt;関数である(&lt;a href="http://www.mathworks.co.jp/help/toolbox/signal/ref/freqz.html"&gt;matlabのfreqz&lt;/a&gt;関数に対応する)。応答関数は入力 x のパワースペクトル密度関数 Pxx と出力のクロススペクトル密度関数 Pyx の比としても推定できる。スペクトル密度関数を求める関数psdに関しては&lt;a href="http://www.google.co.jp/search?rlz=1C1GGGE_jaJP404JP405&amp;amp;gcx=c&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8&amp;amp;q=mlab.psd+site%3Aoceansciencehack.blogspot.com"&gt;何度か紹介した&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint linenums"&gt;#!/usr/bin/env python&lt;br /&gt;&lt;br /&gt;import numpy as np&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;import matplotlib.pylab as plab&lt;br /&gt;import matplotlib.mlab as mlab&lt;br /&gt;from scipy.signal import freqz,lfilter&lt;br /&gt;&lt;br /&gt;#--- Signal&lt;br /&gt;&lt;br /&gt;Fs = 1   # frequency &lt;br /&gt;T = 1000.    # final time&lt;br /&gt;t = np.arange(0.,T+1./Fs,1./Fs)  # time&lt;br /&gt;x = np.sin(2.*np.pi*t/6.) + np.sin(2.*np.pi*t/48.)+np.random.normal(0,0.1,len(t)) # input signal&lt;br /&gt;&lt;br /&gt;#---- power spectral by Welch's method &lt;br /&gt;&lt;br /&gt;plt.figure()&lt;br /&gt;nfft = 256&lt;br /&gt;window = np.hanning(256) &lt;br /&gt;noverlap = 128 &lt;br /&gt;[Pxx,f] = mlab.psd(x,NFFT=nfft,Fs=Fs,window=window,noverlap=noverlap,detrend=plab.detrend_none) # Power spectral&lt;br /&gt;plt.subplot(2,2,1) &lt;br /&gt;plt.plot(f,10*np.log10(Pxx)) # plot in decibel &lt;br /&gt;plt.legend(('Pxx',))&lt;br /&gt;plt.plot([1./12.,1./12],[-70.,20.],'k--')&lt;br /&gt;plt.plot([1./6.,1./6],[-70.,20.],'k--')&lt;br /&gt;plt.plot([1./48.,1./48],[-70.,20.],'k--')&lt;br /&gt;plt.ylim((-70,20))&lt;br /&gt;&lt;br /&gt;#--- Moving average&lt;br /&gt;&lt;br /&gt;h = np.ones(13)/13.&lt;br /&gt;&lt;br /&gt;#--- Calculate theoritical response&lt;br /&gt;&lt;br /&gt;fs,Res = freqz(h)&lt;br /&gt;plt.subplot(2,2,2)&lt;br /&gt;plt.plot(fs/2./np.pi,np.abs(Res))&lt;br /&gt;plt.legend(('theoretical response',))&lt;br /&gt;plt.plot([1./12.,1./12],[0.,1.],'k--')&lt;br /&gt;plt.plot([1./6.,1./6],[0.,1.],'k--')&lt;br /&gt;plt.plot([1./48.,1./48],[0.,1.],'k--')&lt;br /&gt;plt.ylim((0,1.))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#--- Apply Filter&lt;br /&gt;&lt;br /&gt;y = lfilter(h,1,x) # filter &lt;br /&gt;&lt;br /&gt;[Pxy,f] = mlab.csd(x,y,NFFT=nfft,Fs=Fs,window=window,noverlap=noverlap,detrend=plab.detrend_none) # cross scectral density&lt;br /&gt;&lt;br /&gt;[Pyy,f] = mlab.psd(y,NFFT=nfft,Fs=Fs,window=window,noverlap=noverlap,detrend=plab.detrend_none)  # power spectral density &lt;br /&gt;&lt;br /&gt;plt.subplot(2,2,3)&lt;br /&gt;plt.plot(f,10.*np.log10(abs(Pyy)))&lt;br /&gt;plt.legend(('Pyy',))&lt;br /&gt;plt.plot([1./12.,1./12],[-70.,20.],'k--')&lt;br /&gt;plt.plot([1./6.,1./6],[-70.,20.],'k--')&lt;br /&gt;plt.plot([1./48.,1./48],[-70.,20.],'k--')&lt;br /&gt;plt.ylim((-70,20))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#--- Calculate estimated response&lt;br /&gt;&lt;br /&gt;Resc = Pxy/Pxx &lt;br /&gt;plt.subplot(2,2,4)&lt;br /&gt;plt.plot(f,abs(Resc)); &lt;br /&gt;plt.legend(('estimated response',)) &lt;br /&gt;plt.plot([1./12.,1./12],[0.,1.],'k--')&lt;br /&gt;plt.plot([1./6.,1./6],[0.,1.],'k--')&lt;br /&gt;plt.plot([1./48.,1./48],[0.,1.],'k--')&lt;br /&gt;plt.ylim([0,1])&lt;br /&gt;&lt;br /&gt;#--- Save fig&lt;br /&gt;plt.savefig("test_response.png")&lt;br /&gt;plt.show()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-sY1gic1g9Qo/Tpto7BHXoVI/AAAAAAAAApg/Odq_8hMpQJo/s1600/test_response.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-sY1gic1g9Qo/Tpto7BHXoVI/AAAAAAAAApg/Odq_8hMpQJo/s320/test_response.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;以下がフィルタを12ヶ月移動平均にした場合。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-wE_zwUBOpuI/Tptsi46605I/AAAAAAAAApo/v1FehlSjRgc/s1600/test_response12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/-wE_zwUBOpuI/Tptsi46605I/AAAAAAAAApo/v1FehlSjRgc/s320/test_response12.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;以下はシグナルからホワイトノイズを除いた場合。この時はスペクトルからの応答関数の推定はうまくいかない（移動平均はこの場合は13ヶ月）。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-99qqb8kii3M/TpttyQyCCzI/AAAAAAAAApw/wraGrXepw3A/s1600/test_response_now.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-99qqb8kii3M/TpttyQyCCzI/AAAAAAAAApw/wraGrXepw3A/s320/test_response_now.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;参考）　&lt;a href="http://www.scipy.org/Cookbook/FIRFilter"&gt;Scipy Cookbook FIRFilter&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-75066412554318520?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/75066412554318520/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=75066412554318520' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/75066412554318520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/75066412554318520'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2011/10/blog-post.html' title='フィルタの応答関数'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-sY1gic1g9Qo/Tpto7BHXoVI/AAAAAAAAApg/Odq_8hMpQJo/s72-c/test_response.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-275905771393058354</id><published>2011-05-06T18:27:00.000+09:00</published><updated>2011-05-06T18:27:10.659+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data'/><category scheme='http://www.blogger.com/atom/ns#' term='grads'/><title type='text'>気象庁全球数値予報モデルGPV (GSM)</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.jmbsc.or.jp/hp/online/f-online0a.html"&gt;気象庁全球数値予報モデルGPV (GSM) &lt;/a&gt;の初期値データを&lt;a href="http://database.rish.kyoto-u.ac.jp/arch/jmadata/gpv-original.html"&gt;京都大学のサイト&lt;/a&gt;からダウンロードして、&lt;a href="http://shimizus.hustle.ne.jp/wiki/wiki.cgi?page=%A5%E2%A5%C7%A5%EB%B4%D8%CF%A2%A5%E1%A5%E2"&gt;清水慎吾さん作成のgsm2bin&lt;/a&gt;でgrib2形式からgrads形式に変換するモジュール。&lt;br /&gt;&lt;br /&gt;以下がそのモジュール。サンプルのメインプログラムでは、２０１１年１月１日6時のデータを変換し、&lt;a href="http://opengrads.org/wiki/index.php?title=Python_Interface_to_GrADS"&gt;python interface to grads&lt;/a&gt;で海面気圧をプロットしている。&lt;br /&gt;&lt;br /&gt;get_gsm.py&lt;br /&gt;&lt;pre class="prettyprint"&gt;def get_gsm(date=[2011,1,1,0],dir="."):&lt;br /&gt;    """&lt;br /&gt;   download jma gsm initial data from   http://database.rish.kyoto-u.ac.jp/arch/jmadata/da&lt;br /&gt;ta/gpv/original/&lt;br /&gt;   and&lt;br /&gt;   convert to grads file using gsm2bin by Dr. Shingo Shimizu&lt;br /&gt;   (http://shimizus.hustle.ne.jp/wiki/wiki.cgi?page=%A5%E2%A5%C7%A5%EB%B4%D8%CF%A2%A5%E1%A&lt;br /&gt;5%E2)&lt;br /&gt;&lt;br /&gt;   usage:&lt;br /&gt;      get_gsm(date,dir)&lt;br /&gt;     &lt;br /&gt;   input&lt;br /&gt;     &lt;br /&gt;      date: [year,month,day,hour]  hour must be multiple of 6&lt;br /&gt;            default [2011,1,1,0]&lt;br /&gt;      dir : directory to save data    &lt;br /&gt;    """&lt;br /&gt;    import os,urllib&lt;br /&gt;&lt;br /&gt;#check&lt;br /&gt;    assert date[3] % 6 ==0, "Error, hour must be multiple of 6!!!"&lt;br /&gt;&lt;br /&gt;#names from date&lt;br /&gt;    urldir,original,gradsbinname,gradsdate=name_maker(date)&lt;br /&gt;&lt;br /&gt;# get original data&lt;br /&gt;    if not os.path.exists(dir+"/"+original):&lt;br /&gt;        if not os.path.exists(dir): os.mkdir(dir) &lt;br /&gt;        # Download the data&lt;br /&gt;        print 'Downloading data, please wait'&lt;br /&gt;        opener = urllib.urlopen(urldir+original)&lt;br /&gt;        open(dir+"/"+original, 'w').write(opener.read())&lt;br /&gt;        print 'Downloaded'&lt;br /&gt;&lt;br /&gt;# convert to grads file&lt;br /&gt;    os.system("gsm2bin  %(dir)s/%(original)s %(dir)s/%(gradsbinname)s" %locals())&lt;br /&gt;&lt;br /&gt;# make ctlfile&lt;br /&gt;    make_ctl(dir,gradsbinname,gradsdate)&lt;br /&gt;&lt;br /&gt;############################################&lt;br /&gt;&lt;br /&gt;def name_maker(date):&lt;br /&gt;    """&lt;br /&gt;    make filenames from date&lt;br /&gt;"""&lt;br /&gt;    &lt;br /&gt;    import datetime&lt;br /&gt;    time=datetime.datetime(*date)&lt;br /&gt;    cyear=time.strftime("%Y")&lt;br /&gt;    cmonth=time.strftime("%m")&lt;br /&gt;    cmonth2=(time.strftime("%b")).lower()&lt;br /&gt;    cday=time.strftime("%d")&lt;br /&gt;    chour=time.strftime("%H")&lt;br /&gt;&lt;br /&gt;    # URL of original data&lt;br /&gt;    urldir="http://database.rish.kyoto-u.ac.jp/arch/jmadata/data/gpv/original/%(cyear)s/%(&lt;br /&gt;cmonth)s/%(cday)s/" %locals()&lt;br /&gt;&lt;br /&gt;    # File name of original data&lt;br /&gt;    original="Z__C_RJTD_%(cyear)s%(cmonth)s%(cday)s%(chour)s0000_GSM_GPV_Rgl_FD0000_grib2.&lt;br /&gt;bin" %locals()&lt;br /&gt;&lt;br /&gt;    # grads bin name after conversion&lt;br /&gt;    gradsbinname="gsm%(cyear)s%(cmonth)s%(cday)s%(chour)s.bin" %locals()&lt;br /&gt;&lt;br /&gt;    # date in grads format&lt;br /&gt;    gradsdate="%(chour)s:00Z%(cday)s%(cmonth2)s%(cyear)s"  %locals()&lt;br /&gt;    return urldir,original,gradsbinname,gradsdate&lt;br /&gt;&lt;br /&gt;###########################################&lt;br /&gt;def make_ctl(dir,gradsbinname,gradsdate):&lt;br /&gt;    """&lt;br /&gt;    make grads ctl file for GSM data &lt;br /&gt;"""&lt;br /&gt;    #ctl file text&lt;br /&gt;&lt;br /&gt;    ctltxt="""&lt;br /&gt;dset ^%(gradsbinname)s&lt;br /&gt;options template&lt;br /&gt;undef -999&lt;br /&gt;xdef 720 LINEAR 0.0 0.5&lt;br /&gt;ydef 361 LINEAR -90.0 0.5&lt;br /&gt;zdef 17  LEVELS 1000 925 850 700 600 500 400 300 250 200 150 100 70 50&lt;br /&gt;30 20 10&lt;br /&gt;tdef 1 LINEAR %(gradsdate)s 6hr&lt;br /&gt;&lt;br /&gt;vars 16&lt;br /&gt;slp 0  0 sea level pressure&lt;br /&gt;sp  0  0 surface pressure&lt;br /&gt;su  0  0 surface westerly  wind&lt;br /&gt;sv  0  0 surface southerly wind&lt;br /&gt;st  0  0 surface temperature&lt;br /&gt;srh 0  0 surface relative humidity&lt;br /&gt;lca 0  0 LowCloudAmount&lt;br /&gt;mca 0  0 MidCloudAmount&lt;br /&gt;hca 0  0 HighCloudAmount&lt;br /&gt;tca 0  0 TotalCloudAmount&lt;br /&gt;z   17 0 height  &lt;br /&gt;u   17 0 westerly wind&lt;br /&gt;v   17 0 southerly wind&lt;br /&gt;t   17 0 temperature&lt;br /&gt;rh  17 0 relative humidity&lt;br /&gt;w   17 0 p-velocity&lt;br /&gt;endvars&lt;br /&gt;"""&lt;br /&gt;&lt;br /&gt;    # write to file&lt;br /&gt;    gradsctlname=dir+"/"+gradsbinname.replace(".bin",".ctl")&lt;br /&gt;    f=open(gradsctlname,"w")&lt;br /&gt;    f.write(ctltxt %locals())&lt;br /&gt;    f.close()&lt;br /&gt;&lt;br /&gt;#-----------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;&lt;br /&gt;    # get gsm data&lt;br /&gt;    get_gsm(date=[2011,1,1,6],dir="DATA")&lt;br /&gt;&lt;br /&gt;    # plot&lt;br /&gt;    from grads.galab import GaLab  # for python interface for grads&lt;br /&gt;    ga = GaLab(Bin='grads',Window=False,Echo=True,Verb=0,Port=False)&lt;br /&gt;    ga.open("DATA/gsm2011010106.ctl")&lt;br /&gt;    script="""&lt;br /&gt;    set grads off&lt;br /&gt;    set gxout shaded&lt;br /&gt;    d slp/100&lt;br /&gt;    cbarn&lt;br /&gt;    draw title Sea level pressure (hpa)&lt;br /&gt;    printim gsm.png white&lt;br /&gt;    """&lt;br /&gt;    ga(script)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-eqPZQKLz5f8/TcO-nLAtwoI/AAAAAAAAAoA/8ttBEsXqOKk/s1600/gsm.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="247" src="http://1.bp.blogspot.com/-eqPZQKLz5f8/TcO-nLAtwoI/AAAAAAAAAoA/8ttBEsXqOKk/s320/gsm.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-275905771393058354?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/275905771393058354/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=275905771393058354' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/275905771393058354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/275905771393058354'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2011/05/gpv-gsm.html' title='気象庁全球数値予報モデルGPV (GSM)'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-eqPZQKLz5f8/TcO-nLAtwoI/AAAAAAAAAoA/8ttBEsXqOKk/s72-c/gsm.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-4308817052613448244</id><published>2011-03-05T09:52:00.000+09:00</published><updated>2011-03-05T09:52:13.647+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data'/><category scheme='http://www.blogger.com/atom/ns#' term='f2py'/><category scheme='http://www.blogger.com/atom/ns#' term='cdat'/><title type='text'>気象庁MGDSST</title><content type='html'>&lt;br /&gt;&lt;br /&gt;気象庁の海面水温データ（0.25x0.25度、daily)であるMGDSSTをウェブからダンロードしてから、データを読み込むまでのモジュールをつくる。MGDSSTは&lt;a href="http://goos.kishou.go.jp/"&gt;NEAR-GOOSのサイト&lt;/a&gt;から入手が可能である。&lt;br /&gt;idとpasswordが必要なので、あらかじめ登録しておく。&lt;br /&gt;&lt;br /&gt;以下がスクリプト&lt;br /&gt;usrname="xxxxx"&lt;br /&gt;password="*****"&lt;br /&gt;のところを自分のidとpasswordで置き換える。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;import numpy as np &lt;br /&gt;import os&lt;br /&gt;&lt;br /&gt;def downloadfile(infile="remotefile",outfile="localfile"):&lt;br /&gt;    """&lt;br /&gt;    download file from NEAR-GOOS data site with id and password&lt;br /&gt;    input&lt;br /&gt;       infile: remote file on the web&lt;br /&gt;       outfile: local file&lt;br /&gt;    &lt;br /&gt;    set password and id below&lt;br /&gt;    """&lt;br /&gt;    import urllib2&lt;br /&gt;    host="goos.kishou.go.jp:80"&lt;br /&gt;    realm="NEAR-GOOS"&lt;br /&gt;    usrname="xxxxx"&lt;br /&gt;    password="*****"&lt;br /&gt;    auth_handler = urllib2.HTTPBasicAuthHandler() &lt;br /&gt;    auth_handler.add_password(realm, host, usrname, password) &lt;br /&gt;    opener = urllib2.build_opener(auth_handler) &lt;br /&gt;    urllib2.install_opener(opener) &lt;br /&gt;    f=urllib2.urlopen(infile)&lt;br /&gt;    open(outfile, 'w').write(f.read())&lt;br /&gt;&lt;br /&gt;#----------------------------------------------------------&lt;br /&gt;def readMGDSST(dir=".",year=2010,month=1,day=1,lonrange=(0,360),latrange=(-90,90)):&lt;br /&gt;    """&lt;br /&gt;    load MGDSST data from NEAR-GOOSE site&lt;br /&gt;    read data with fortran (f2py)&lt;br /&gt;    select region specified by lonrange and latrange &lt;br /&gt;&lt;br /&gt;    Usage:&lt;br /&gt;    lon,lat,sst= readMGDSST(dir=".",year=2010,month=1,day=1,lonrange=(0,360),latrange=(-90,90)&lt;br /&gt;&lt;br /&gt;    Input &lt;br /&gt;       dir: directory for data download&lt;br /&gt;       year,month,day:  date of the data &lt;br /&gt;       lonrange,latrange = longitude and latitude range for data&lt;br /&gt;    output&lt;br /&gt;       lon, lat: longitude, latitude&lt;br /&gt;       sst:  sst data&lt;br /&gt;"""&lt;br /&gt;&lt;br /&gt;# date&lt;br /&gt;    import datetime&lt;br /&gt;    t=datetime.datetime(year,month,day)&lt;br /&gt;    syear=t.strftime("%Y")&lt;br /&gt;    smon=t.strftime("%b")&lt;br /&gt;    sday=t.strftime("%d")&lt;br /&gt;# filename&lt;br /&gt;    dataname="mgdsst."+smon+sday&lt;br /&gt;    filename=dir+"/"+dataname+"."+syear&lt;br /&gt;    filenamegz=filename+".gz"&lt;br /&gt;    print filename&lt;br /&gt;    urlname="http://goos.kishou.go.jp/rrtdb/usr/pub/JMA/mgdsst/"+syear+"/"+dataname+".gz"&lt;br /&gt;&lt;br /&gt;# file exist?&lt;br /&gt;    if not os.path.exists(filename):&lt;br /&gt;        if not os.path.exists(filenamegz):&lt;br /&gt;           downloadfile(infile=urlname,outfile=filenamegz)&lt;br /&gt;        os.system("gunzip %(filenamegz)s" %locals())         &lt;br /&gt;&lt;br /&gt;# temp.bin is used for temporary file&lt;br /&gt;    if os.path.lexists("temp.bin"):&lt;br /&gt;        raise IOError("temporary file temp.bin somehow exist! Remove it!") &lt;br /&gt;    else:&lt;br /&gt;        os.system("ln -s %(filename)s temp.bin" %locals())&lt;br /&gt;&lt;br /&gt;# data read through fortran (f2py)&lt;br /&gt;    from read_sst import read_sst&lt;br /&gt;    im=1440&lt;br /&gt;    jm=720&lt;br /&gt;    sst=np.zeros([jm,im])&lt;br /&gt;&lt;br /&gt;    sst,ierr=read_sst()&lt;br /&gt;    assert ierr==0, "data error in fortran"&lt;br /&gt;&lt;br /&gt;    lon=0.125+0.25*np.arange(im)&lt;br /&gt;    lat=-89.875+0.25*np.arange(jm)&lt;br /&gt;&lt;br /&gt;    os.system("rm temp.bin")&lt;br /&gt;&lt;br /&gt;# range selection&lt;br /&gt;    xrange=np.logical_and(lon&amp;gt;=lonrange[0],lon&amp;lt;=lonrange[1])&lt;br /&gt;    yrange=np.logical_and(lat&amp;gt;=latrange[0],lat&amp;lt;=latrange[1])&lt;br /&gt;    sst=(sst[yrange,:])[:,xrange] &lt;br /&gt;&lt;br /&gt;    return lon[xrange],lat[yrange], sst&lt;br /&gt;&lt;br /&gt;#-----------------------------------------------------------------------&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;    import cdms2,MV2,vcs #cdat&lt;br /&gt;&lt;br /&gt;    # read data&lt;br /&gt;    lon,lat,sst=readMGDSST(dir="DATA",year=2011,month=1,day=1,lonrange=(0,360),latrange=(-90,90))&lt;br /&gt;&lt;br /&gt;    # hearafter plot with cdat&lt;br /&gt;    # First let's create a variable&lt;br /&gt;    var = MV2.masked_array(sst,mask=(sst&amp;lt;-990.),id="SST")&lt;br /&gt;&lt;br /&gt;    # Now create the axis&lt;br /&gt;    lons=cdms2.createAxis(lon)&lt;br /&gt;    lats=cdms2.createAxis(lat)&lt;br /&gt;&lt;br /&gt;    # And decorate it&lt;br /&gt;    lons.id = 'longitude'&lt;br /&gt;    lats.id = 'latitude'&lt;br /&gt;    lons.units = 'degrees_east'&lt;br /&gt;    lats.units = 'degrees_north'&lt;br /&gt;&lt;br /&gt;    # Just to make sure we will describe this axis as a longitude one&lt;br /&gt;    lons.designateLongitude()&lt;br /&gt;    lats.designateLatitude()&lt;br /&gt;&lt;br /&gt;    # Now let's apply these to the variable&lt;br /&gt;    var.setAxisList((lats,lons))&lt;br /&gt;&lt;br /&gt;    #var.info() to see info&lt;br /&gt;&lt;br /&gt;    #plot &lt;br /&gt;    v = vcs.init()&lt;br /&gt;    v.plot(var)&lt;br /&gt;    v.png("MGDSST.png")&lt;br /&gt;    del v&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;上のサンプルメインプログラムでは、2011年1月1日のデータをディレクトリ"DATA"にダウンロードし、経度0から360度、緯度-90度から90度の範囲で読み込んでいる。&lt;br /&gt;その上で、&lt;a href="http://www2-pcmdi.llnl.gov/cdat"&gt;cdat&lt;/a&gt;を用いて可視化した。&lt;br /&gt;結果は以下の図。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-Ek1CuUFXYh8/TXGIB662zJI/AAAAAAAAAno/CSEf7NOvajg/s1600/MGDSST.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="308" src="https://lh3.googleusercontent.com/-Ek1CuUFXYh8/TXGIB662zJI/AAAAAAAAAno/CSEf7NOvajg/s400/MGDSST.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;ダウンロードしたバイナリファイルを読むのにfortranのプログラムをモジュールとしてつかう。&lt;a href="http://shimizus.hustle.ne.jp/wiki/wiki.cgi?page=%A5%E2%A5%C7%A5%EB%B4%D8%CF%A2%A5%E1%A5%E2"&gt;清水慎吾さんのデータを読むサンプルプログラム&lt;/a&gt;を参考に、以下のようなfortranサブルーチンを作った（配列はpython風に緯度と経度を入れ替えている。欠損値は-999.）。&lt;br /&gt;このプログラムを&lt;a href="http://cens.ioc.ee/projects/f2py2e/"&gt;f2py&lt;/a&gt;を使って以下のようにコンパイルすればpythonのモジュールとして使用が可能になる（上のプログラムのread_sst)。&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: #f3f3f3;"&gt;f2py --f90exec=gfortran -c -m read_sst read_sst.f90&lt;/span&gt;&lt;br /&gt;(ここではgfortranを使っている。）&lt;br /&gt;&lt;br /&gt;read_sst.ｆ90&lt;br /&gt;&lt;pre class="prettyprint"&gt;subroutine READ_SST(sst,ierr)&lt;br /&gt;  implicit none&lt;br /&gt;  integer   :: year,mon,day&lt;br /&gt;  integer   :: i,j,jj&lt;br /&gt;  &lt;br /&gt;  integer,parameter :: im=1440&lt;br /&gt;  integer,parameter :: jm=720&lt;br /&gt;! &lt;br /&gt;  real,intent(out):: sst(jm,im)&lt;br /&gt;  integer, intent(out):: ierr&lt;br /&gt;!&lt;br /&gt;  integer   :: isst(im,jm),ist&lt;br /&gt;  real      :: undef = -999.&lt;br /&gt;  &lt;br /&gt;  open(55,file="temp.bin",status='old',form='formatted',iostat=ierr,err=999)&lt;br /&gt;  read(55,*) year,mon,day&lt;br /&gt;  write(6,*) year,mon,day&lt;br /&gt;&lt;br /&gt;  do j=1,jm&lt;br /&gt;     read(55,10,iostat=ierr,err=999) (isst(i,j),i=1,im)&lt;br /&gt;  enddo&lt;br /&gt;  close(55)&lt;br /&gt;10 format(1440i3)&lt;br /&gt;&lt;br /&gt;  do j=1,jm&lt;br /&gt;     do i=1,im&lt;br /&gt;        jj = jm -j +1&lt;br /&gt;        ist = isst(i,jj)&lt;br /&gt;        if(ist .eq. 888 .or. ist.eq.999) then&lt;br /&gt;           sst(j,i) = undef&lt;br /&gt;        else&lt;br /&gt;           sst(j,i) = real(ist)*0.1 &lt;br /&gt;        endif        &lt;br /&gt;     enddo&lt;br /&gt;  enddo&lt;br /&gt;  return &lt;br /&gt;999 print *, "Read Error!"&lt;br /&gt;&lt;br /&gt;end subroutine READ_SST&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-4308817052613448244?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/4308817052613448244/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=4308817052613448244' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/4308817052613448244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/4308817052613448244'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2011/03/mgdsst.html' title='気象庁MGDSST'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh3.googleusercontent.com/-Ek1CuUFXYh8/TXGIB662zJI/AAAAAAAAAno/CSEf7NOvajg/s72-c/MGDSST.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-8852947672134613007</id><published>2011-02-25T10:37:00.001+09:00</published><updated>2011-02-25T10:38:36.743+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data'/><category scheme='http://www.blogger.com/atom/ns#' term='grads'/><title type='text'>Gradsでregrid</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.iges.org/grads/"&gt;GrADS&lt;/a&gt;において、二つのデータセットのグリッドをそろえて、差を見てみることをおこなった。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://opengrads.org/"&gt;OpenGrADS&lt;/a&gt;の&lt;a href="http://opengrads.org/doc/udxt/re/"&gt;re関数&lt;/a&gt;を用いた。&lt;br /&gt;下のソース例、&lt;br /&gt;define sstre=re(sst.1,180,linear,0,2,89,linear,-88,2,ba)&lt;br /&gt;では、変数sst.1を&lt;br /&gt;経度方向に、180グリッド、0度から2度刻みで、線形&lt;br /&gt;緯度方向に、89グリッド、南緯88度から2度刻みで、線形&lt;br /&gt;box averageでグリッドに落としている。&lt;br /&gt;&lt;br /&gt;例では&lt;a href="http://www.esrl.noaa.gov/psd/data/gridded/data.noaa.oisst.v2.html"&gt;NOAA OISST version 2&lt;/a&gt;(1)と&lt;a href="http://www.esrl.noaa.gov/psd/data/gridded/data.noaa.ersst.html"&gt;NOAA Extended Reconstructed SST version 3b&lt;/a&gt;(2)という二つの１月の海面水温データセットから２０１１年１月の値をそれぞれプロットし、3番目の図で、その差(2-1)を引いている。データは&lt;a href="http://www.esrl.noaa.gov/psd/data/gridded/using_dods.html"&gt;NOAAのサイトからOPeNDAP&lt;/a&gt;で取得している。&lt;br /&gt;&lt;br /&gt;下がgradsのスクリプト。&lt;br /&gt;"grads -p"でportraitモードで使う。&lt;br /&gt;他に、&lt;a href="http://kodama.fubuki.info/wiki/wiki.cgi/GrADS/script/mul.gs?lang=jp"&gt;mul.gs&lt;/a&gt;, &lt;a href="http://kodama.fubuki.info/wiki/wiki.cgi/GrADS/script/color.gs?lang=jp"&gt;color.gs&lt;/a&gt;, &lt;a href="http://kodama.fubuki.info/wiki/wiki.cgi/GrADS/script/draws.gs?lang=jp"&gt;draws.gs &lt;/a&gt;という Chihiro Kodama氏のgradsスクリプトを用いている。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;"reinit"&lt;br /&gt;*NOAA OISST V2&lt;br /&gt;"sdfopen http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/noaa.oisst.v2/sst.m&lt;br /&gt;nmean.nc"&lt;br /&gt;"set time jan2011"&lt;br /&gt;"mul 1 3 1 3 -yoffset -0.5"&lt;br /&gt;"set grads off"&lt;br /&gt;"color 0 30 2 -kind grainbow -gxout grfill"&lt;br /&gt;"d sst"&lt;br /&gt;"set strsiz 0.15"&lt;br /&gt;"draws 1) NOAA OISST V2"&lt;br /&gt;&lt;br /&gt;*NOAA Extended Reconstructed SST V3b&lt;br /&gt;"sdfopen http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/noaa.ersst/sst.mnme&lt;br /&gt;an.nc"&lt;br /&gt;"set time jan2011"&lt;br /&gt;"mul 1 3 1 2  -yoffset -0.5 "&lt;br /&gt;"set grads off"&lt;br /&gt;"color 0 30 2 -kind grainbow -gxout grfill"&lt;br /&gt;"d sst.2"&lt;br /&gt;"set strsiz 0.15"&lt;br /&gt;"draws 2) NOAA Extended Reconstructed SST V3b"&lt;br /&gt;"cbarn 0.7 1 7.6 7.5"&lt;br /&gt;&lt;br /&gt;*diff&lt;br /&gt;"define sstre=re(sst.1,180,linear,0,2,89,linear,-88,2,ba)"&lt;br /&gt;"mul 1 3 1 1  -yoffset -0.5"&lt;br /&gt;"set grads off"&lt;br /&gt;"color -levs -2 -1.5 -1 -0.5 0.5 1.0 1.5 2  -kind blue-&amp;gt;white-&amp;gt;red -gxout grfill"&lt;br /&gt;"d sst.2-sstre"&lt;br /&gt;"set strsiz 0.15"&lt;br /&gt;"draws 2)-1)"&lt;br /&gt;"cbarn 0.7 1 1. 2."&lt;br /&gt;"printim sst_regrid_compare.png white"&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-PpymSsTKneE/TWcHOPK2UnI/AAAAAAAAAnk/Vg-77UZSkIA/s1600/sst_regrid_compare.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/-PpymSsTKneE/TWcHOPK2UnI/AAAAAAAAAnk/Vg-77UZSkIA/s400/sst_regrid_compare.png" width="308" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-8852947672134613007?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/8852947672134613007/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=8852947672134613007' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/8852947672134613007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/8852947672134613007'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2011/02/gradsregrid.html' title='Gradsでregrid'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-PpymSsTKneE/TWcHOPK2UnI/AAAAAAAAAnk/Vg-77UZSkIA/s72-c/sst_regrid_compare.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-8534409432041112569</id><published>2011-02-18T19:02:00.001+09:00</published><updated>2011-02-18T19:13:51.681+09:00</updated><title type='text'>GaLab in Python Interface to GrADS</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://opengrads.org/wiki/index.php?title=Python_Interface_to_GrADS"&gt;Python Interface to GrADS&lt;/a&gt;の&lt;a href="http://opengrads.org/doc/python/grads/grads.galab.html"&gt;GaLab&lt;/a&gt;を用いてプロットしてみた。&lt;br /&gt;プロットしたデータは&lt;a href="http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.html"&gt;Earth System Research Laboratoryで配布されているNCEP/NCAR再解析&lt;/a&gt;の2011年１月の海水面気圧をOPeNDAPで取得している。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;import matplotlib.pyplot as plt&lt;br /&gt;from grads.galab import GaLab  # for python interface for grads&lt;br /&gt;&lt;br /&gt;ga = GaLab(Bin='grads',Window=False,Echo=True,Verb=0,Port=False)&lt;br /&gt;&lt;br /&gt;ga.open("http://www.esrl.noaa.gov/psd/thredds/dodsC//Datasets/ncep.reanalysis.de&lt;br /&gt;rived/surface/slp.mon.mean.nc")&lt;br /&gt;&lt;br /&gt;ga.blue_marble("on")&lt;br /&gt;ga("set time jan2011")&lt;br /&gt;ga.basemap('ortho',opts=(130.,40.))&lt;br /&gt;&lt;br /&gt;ga.contour("slp")&lt;br /&gt;del ga&lt;br /&gt;plt.title("Sea Level Pressure (Jan2011)")&lt;br /&gt;plt.savefig("galab_slp.png")&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-6hNHXaBzANE/TV5C8dFKl8I/AAAAAAAAAng/y5kfuFcX6LA/s1600/galab_slp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-6hNHXaBzANE/TV5C8dFKl8I/AAAAAAAAAng/y5kfuFcX6LA/s320/galab_slp.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://matplotlib.sourceforge.net/basemap/doc/html/"&gt;Matplotlib Basemap Toolkit&lt;/a&gt;よりも手軽にプロットできる半面、緯度・経度線を取り除いたりとかの自由はききにくいようだ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-8534409432041112569?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/8534409432041112569/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=8534409432041112569' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/8534409432041112569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/8534409432041112569'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2011/02/galab-in-python-interface-to-grads.html' title='GaLab in Python Interface to GrADS'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-6hNHXaBzANE/TV5C8dFKl8I/AAAAAAAAAng/y5kfuFcX6LA/s72-c/galab_slp.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-8680906088247607239</id><published>2010-12-17T15:45:00.000+09:00</published><updated>2010-12-17T15:45:04.390+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data'/><title type='text'>気象庁全国合成レーダー降雨</title><content type='html'>&lt;br /&gt;&lt;br /&gt;気象庁の全国合成レーダー降雨データが&lt;a href="http://database.rish.kyoto-u.ac.jp/arch/jmadata/synthetic-original.html"&gt;こちら&lt;/a&gt;で配布されている。&lt;br /&gt;データは１０分ごとにある。&lt;br /&gt;データはtarでアーカイブされており、その中に含まれるデータはgrib2形式である。&lt;br /&gt;清水慎吾さんが&lt;a href="http://shimizus.hustle.ne.jp/wiki/wiki.cgi?page=%A5%EC%A1%BC%A5%C0%B4%D8%CF%A2%A5%E1%A5%E2"&gt;こちら&lt;/a&gt;で、データをgrads形式に変換するプログラムを公開している（全国合成気象庁レーダ雨量,GRIB2形式)。&lt;br /&gt;&lt;br /&gt;以下のプログラムはファイルをネットから読み込んで、清水さんのツールでgrads形式に変換するpythonスクリプトである。&lt;br /&gt;&lt;br /&gt;RadarToGradsはファイル(tarファイル）をネットから呼んで、tarファイルから降雨データのバイナリファイル(grib2)を取り出し、gradsファイルを作る。&lt;br /&gt;grib2からgradsへのファイル変換は清水さんのjmaradar2binで行っている。gradsコントロールファイル("view_radar.ctl"）が自動的にできるようにmain.cで"gradsout=1"としている。&lt;br /&gt;&lt;br /&gt;PlotByGradsは作ったgradsデータを使って、gradsでプロットしている。gradsを操作するのに、&lt;a href="http://opengrads.org/wiki/index.php?title=Python_Interface_to_GrADS"&gt;pythonインターフェイス&lt;/a&gt;を使っている。&lt;br /&gt;&lt;br /&gt;メインでは、これらを使って、2010年10月20日午前8時００分世界標準時（日本時間午後5時）の降水を東経125-１３５度北緯24-35度でgradsデータに変換して、それをプロットしている。これは&lt;a href="http://ja.wikipedia.org/wiki/%E5%A5%84%E7%BE%8E%E8%B1%AA%E9%9B%A8_(2010%E5%B9%B4)"&gt;奄美大島で豪雨&lt;/a&gt;が発生したころにあたる。&lt;br /&gt;&lt;br /&gt;import_jmaradar.py&lt;br /&gt;&lt;pre class="prettyprint"&gt;def RadarToGrads(dir=".",gradsbinname="temp.bin",year=2010,mon=1,day=1,hour=0,mi&lt;br /&gt;n=0,slon=118.,elon=150.,slat=20.,elat=48.):&lt;br /&gt;    """&lt;br /&gt;   Import JMA rain radar data (every 10min) from http://database.rish.kyoto-u.ac&lt;br /&gt;.jp/arch/jmadata/synthetic-original.html&lt;br /&gt;   Then convert data to grads file using tool by Dr. Shingo Shimizu (http://shim&lt;br /&gt;izus.hustle.ne.jp/wiki/wiki.cgi?page=%A5%EC%A1%BC%A5%C0%B4%D8%CF%A2%A5%E1%A5%E2)&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;   usage:&lt;br /&gt;       RadarToGrads(dir=".",gradsbinname="temp.bin",year=2010,mon=1,day=1,hour=0&lt;br /&gt;,min=0,slon=118.,elon=150.,slat=20.,elat=48.):&lt;br /&gt;     &lt;br /&gt;   input&lt;br /&gt;      dir: directory to import tar file&lt;br /&gt;      gradsbinname: file name for grads binary&lt;br /&gt;      year, mon, day, hour, min  : time for data (every 10 min) in UTC&lt;br /&gt;      slon,elon  Western,East bounday&lt;br /&gt;      slat,elat  South,North bounday&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   output files&lt;br /&gt;      grads binary: gradsbinname&lt;br /&gt;      grads control: view_radar.ctl        &lt;br /&gt;         &lt;br /&gt;    """&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    import os&lt;br /&gt;    import tarfile&lt;br /&gt;    import urllib&lt;br /&gt;&lt;br /&gt;    # filenames&lt;br /&gt;    syear="%04d" % year&lt;br /&gt;    smon="%02d" % mon&lt;br /&gt;    sday="%02d" % day&lt;br /&gt;    shour="%02d" % hour&lt;br /&gt;    smin="%02d" % min&lt;br /&gt;    date=syear+smon+sday+shour+smin&lt;br /&gt;    tarname="Z__C_RJTD_%(date)s00_RDR_JMAGPV__grib2.tar" %locals()&lt;br /&gt;    urldir="http://database.rish.kyoto-u.ac.jp/arch/jmadata/data/jma-radar/synth&lt;br /&gt;etic/original/%(syear)s/%(smon)s/%(sday)s/" %locals()&lt;br /&gt;    filename="Z__C_RJTD_%(date)s00_RDR_JMAGPV_Ggis1km_Prr10lv_ANAL_grib2.bin" %l&lt;br /&gt;ocals()&lt;br /&gt;&lt;br /&gt;    # get tar file&lt;br /&gt;    if not os.path.exists(dir+"/"+tarname):&lt;br /&gt;        if not os.path.exists(dir): os.mkdir(dir) &lt;br /&gt;        # Download the data&lt;br /&gt;        print 'Downloading data, please wait'&lt;br /&gt;        opener = urllib.urlopen(urldir+tarname )&lt;br /&gt;        open(dir+"/"+tarname, 'w').write(opener.read())&lt;br /&gt;        print 'Downloaded'&lt;br /&gt;&lt;br /&gt;    # extract radar precipitation file&lt;br /&gt;    tarfile.open(dir+"/"+tarname, 'r').extract(filename)&lt;br /&gt;&lt;br /&gt;    # convert to grads file&lt;br /&gt;    os.system("jmaradar2bin %(filename)s %(gradsbinname)s %(slon)s %(elon)s %(sl&lt;br /&gt;at)s %(elat)s" %locals())&lt;br /&gt;    os.system("rm %(filename)s" %locals())&lt;br /&gt;&lt;br /&gt;####################################################################&lt;br /&gt;&lt;br /&gt;def PlotByGrads(pngname):&lt;br /&gt;    """&lt;br /&gt;      plot converted JMA radar rain data&lt;br /&gt;    """&lt;br /&gt;    from grads.galab import GaLab  # for python interface for grads&lt;br /&gt;    ga = GaLab(Bin='grads',Window=False,Echo=False,Verb=0,Port=False)&lt;br /&gt;    ga.open("view_radar.ctl")&lt;br /&gt;    script="""&lt;br /&gt;    set grads off&lt;br /&gt;    set mpdset hires&lt;br /&gt;    set gxout shaded&lt;br /&gt;    set clevs 0 1 5 10 20 30 50 80&lt;br /&gt;    d rr&lt;br /&gt;    cbarn&lt;br /&gt;    printim %(pngname)s white&lt;br /&gt;"""&lt;br /&gt;    ga(script %locals())&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#####################################################################&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;&lt;br /&gt;# radar file to grads &lt;br /&gt;    RadarToGrads(dir="DATA",gradsbinname="jmaradar.bin",year=2010,mon=10,day=20,&lt;br /&gt;hour=8,min=00,slon=125.,elon=135.,slat=24.,elat=35.)&lt;br /&gt;&lt;br /&gt;# plot by grads&lt;br /&gt;    PlotByGrads("jmaradar.png")&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DVivl99_vFE/TQsGN-EsQyI/AAAAAAAAAnU/12lX2tHQ3e8/s1600/jmaradar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="247" src="http://1.bp.blogspot.com/_DVivl99_vFE/TQsGN-EsQyI/AAAAAAAAAnU/12lX2tHQ3e8/s320/jmaradar.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-8680906088247607239?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/8680906088247607239/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=8680906088247607239' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/8680906088247607239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/8680906088247607239'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/12/blog-post.html' title='気象庁全国合成レーダー降雨'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_DVivl99_vFE/TQsGN-EsQyI/AAAAAAAAAnU/12lX2tHQ3e8/s72-c/jmaradar.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-6214910061137479914</id><published>2010-11-07T20:36:00.000+09:00</published><updated>2010-11-07T20:36:12.644+09:00</updated><title type='text'>Google Graphで棒グラフ</title><content type='html'>&lt;br /&gt;&lt;br /&gt;GE-GraphというGoogle Graph上に棒グラフをプロットできるフリーソフトがある。&lt;a href="http://www.sgrillo.net/googleearth/gegraph.htm"&gt;http://www.sgrillo.net/googleearth/gegraph.htm&lt;/a&gt;&lt;br /&gt;これを使ってみた。&lt;br /&gt;&lt;br /&gt;結果から。下の図は正味海洋-大気熱フラックス（海から大気）の１月長期平均をGoogle Earth上で棒グラフにしたものである。正値のみ使っている。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DVivl99_vFE/TNZ5_aPKwLI/AAAAAAAAAnM/VvP6mUa8HAo/s1600/heatbar.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="205" src="http://1.bp.blogspot.com/_DVivl99_vFE/TNZ5_aPKwLI/AAAAAAAAAnM/VvP6mUa8HAo/s320/heatbar.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;このkmzファイルは&lt;a href="https://sites.google.com/site/drtorumiyama/climate-monitor/google-earth/sample-1/heatflux.kmz"&gt;こちら&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;GE-Graphに入力するデータとして&lt;br /&gt;場所名,緯度,経度,値&lt;br /&gt;で構成されるcsvファイルを用意する必要がある。&lt;br /&gt;上の例のcsvファイルはコレ（&lt;a href="https://sites.google.com/site/drtorumiyama/climate-monitor/google-earth/sample-1/data0.txt"&gt;その１&lt;/a&gt;,&lt;a href="https://sites.google.com/site/drtorumiyama/climate-monitor/google-earth/sample-1/data1.txt"&gt;その２&lt;/a&gt;）&lt;br /&gt;GE-Graphが5000地点以上を受け付けないのでファイルを２つに分けている。場所名は特に意味は無いので全て0を入れている。&lt;br /&gt;&lt;br /&gt;上のデータをGE-Graphに読み込ませる。設定は以下の図のようにした。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_DVivl99_vFE/TNaHb_Cw1CI/AAAAAAAAAnQ/JISJDuMwjvM/s1600/settings.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/_DVivl99_vFE/TNaHb_Cw1CI/AAAAAAAAAnQ/JISJDuMwjvM/s320/settings.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;それぞれのデータで"Run"を行ってkmzファイルを作った。Google Earth上で二つのファイルをまとめて、saveしたのが上のkmzファイルである。&lt;br /&gt;&lt;br /&gt;最後にcsvファイルを作るpythonプログラムを添付する。&lt;br /&gt;NCEP/NCARのデータをESRLのサイトから&lt;a href="http://opengrads.org/wiki/index.php?title=Python_Interface_to_GrADS"&gt;Python Interface to GrADS &lt;/a&gt;を使って読み込む。&lt;br /&gt;latent/sensible heat flux, longwave/shortwave radiationを全て足して正味の熱フラックスを計算する。&lt;br /&gt;陸・海マスクを読み、海のデータだけを使う。また正（海から大気）のデータだけ残している。データは4000点づつセーブする。&lt;br /&gt;&lt;pre class="prettyprint"&gt;from grads.ganum import GaNum  # for python interface for grads&lt;br /&gt;import numpy as np&lt;br /&gt;&lt;br /&gt;#====== DATA read&lt;br /&gt;ga = GaNum(Bin='grads')&lt;br /&gt;ga("sdfopen http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis.derived/surface_gauss/lhtfl.mon.ltm.nc") #net latent heat flux&lt;br /&gt;ga("sdfopen http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis.derived/surface_gauss/shtfl.mon.ltm.nc") #net sensible heart flux&lt;br /&gt;ga("sdfopen http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis.derived/surface_gauss/nswrs.mon.ltm.nc") #net shortwave radiation&lt;br /&gt;ga("sdfopen http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis.derived/surface_gauss/nlwrs.mon.ltm.nc") #net longwave radiation&lt;br /&gt;ga("set t 1")  # January&lt;br /&gt;ga("netheat=lhtfl.1+shtfl.2+ nswrs.3+nlwrs.4") # all net heat&lt;br /&gt;netheat=ga.exp("netheat")&lt;br /&gt;ga("close 4")&lt;br /&gt;ga("close 3")&lt;br /&gt;ga("close 2")&lt;br /&gt;ga("close 1")&lt;br /&gt;ga("sdfopen http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis/surface_gauss/land.sfc.gauss.nc")  #land sea mask&lt;br /&gt;land=ga.exp("land")&lt;br /&gt;del ga&lt;br /&gt;&lt;br /&gt;lon=netheat.grid.lon&lt;br /&gt;lat=netheat.grid.lat&lt;br /&gt;&lt;br /&gt;#===== DATA manupilation&lt;br /&gt;data=netheat.data&lt;br /&gt;data[land&amp;gt;0]=-999.  # remove values on land&lt;br /&gt;&lt;br /&gt;x,y=np.meshgrid(lon,lat)&lt;br /&gt;&lt;br /&gt;vl=0.               # data criteria &lt;br /&gt;&lt;br /&gt;xout=x[data&amp;gt;vl].flatten()      # only  values &amp;gt;vl  are used&lt;br /&gt;xout[xout&amp;gt;180]=xout[xout&amp;gt;180]-360. #   -180.=&amp;lt;lon&amp;lt;=180.  &lt;br /&gt;yout=y[data&amp;gt;vl].flatten()      # only  values &amp;gt;vl  are used&lt;br /&gt;zout=data[data&amp;gt;vl].flatten()   # only  values &amp;gt;vl  are used&lt;br /&gt;points=np.zeros(data[data&amp;gt;vl].size) # position number (anythin is ok)&lt;br /&gt;&lt;br /&gt;#==== DATA output&lt;br /&gt;nn=zout.size/4000+1&lt;br /&gt;for n in range(nn):&lt;br /&gt;    st=4000*n&lt;br /&gt;    en=4000*(n+1)&lt;br /&gt;    np.savetxt("data%(n)s.txt" %locals(),np.transpose((points[st:en],yout[st:en],xout[st:en],zout[st:en])),fmt='%4i,%7.3f,%7.3f,%7.3f')&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-6214910061137479914?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/6214910061137479914/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=6214910061137479914' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/6214910061137479914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/6214910061137479914'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/11/google-graph.html' title='Google Graphで棒グラフ'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_DVivl99_vFE/TNZ5_aPKwLI/AAAAAAAAAnM/VvP6mUa8HAo/s72-c/heatbar.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-643092323436744546</id><published>2010-10-29T00:12:00.005+09:00</published><updated>2010-11-07T20:39:00.388+09:00</updated><title type='text'>Google Earthでアニメーション</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/09/8500hpa.html"&gt;以前、Google Earthで図を描いたが&lt;/a&gt;、今回はアニメーションを作ってみる。図が3枚だけのアニメーションだ。&lt;br /&gt;&lt;br /&gt;&lt;u&gt;手順１&lt;/u&gt;&lt;br /&gt;&lt;a href="http://www.iges.org/grads/"&gt;Grads&lt;/a&gt;で図を3枚つくる。GradsでGoogle Earth向きの図をつくるやり方は&lt;a href="http://oceansciencehack.blogspot.com/2010/09/8500hpa.html"&gt;以前の記事&lt;/a&gt;を参照のこと。下の例は&lt;a href="http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.html"&gt;NCEP/NCARの最解析データ&lt;/a&gt;を使って、2008年から2010年の8月の表面大気温度のアノマリをプロットしている。colorbarはxcbarを使って図の上に一緒に乗せた。 &lt;br /&gt;&lt;pre class="prettyprint"&gt;"reinit"&lt;br /&gt;"sdfopen http://www.esrl.noaa.gov/psd/thredds/dodsC//Datasets/ncep.reanalysis.de&lt;br /&gt;rived/surface/air.mon.mean.nc"&lt;br /&gt;"sdfopen http://www.esrl.noaa.gov/psd/thredds/dodsC//Datasets/ncep.reanalysis.de&lt;br /&gt;rived/surface/air.mon.ltm.nc"&lt;br /&gt;year=2008&lt;br /&gt;while (year&amp;lt;=2010)&lt;br /&gt;"set time aug"year&lt;br /&gt;"set x 1 144"&lt;br /&gt;"set y 1 73"&lt;br /&gt;"set parea 0 11 0 8.5"&lt;br /&gt;"set grid off"&lt;br /&gt;"set grads off"&lt;br /&gt;"set mproj scaled"&lt;br /&gt;"set mpdraw off"&lt;br /&gt;"set gxout shaded"&lt;br /&gt;"color -5 5 0.5 -kind blue-&amp;gt;gray-&amp;gt;red"&lt;br /&gt;"d air.1-air.2(t=8)"&lt;br /&gt;"xcbar  4.5 6.5 4 4.2 -edge triangle -fstep 10 "&lt;br /&gt;"printim  airtemp_"year"aug.png x2048 y1024 -t 0"&lt;br /&gt;"c"&lt;br /&gt;year=year+1&lt;br /&gt;endwhile&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;こんな感じの図ができる。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DVivl99_vFE/TMk96Tv0VCI/AAAAAAAAAnE/1FoF7bVfU1U/s1600/airtemp_2008aug.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="160" src="http://1.bp.blogspot.com/_DVivl99_vFE/TMk96Tv0VCI/AAAAAAAAAnE/1FoF7bVfU1U/s320/airtemp_2008aug.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;u&gt; &lt;/u&gt;&lt;br /&gt;&lt;u&gt; &lt;/u&gt;&lt;br /&gt;&lt;u&gt;手順2&lt;/u&gt;&lt;br /&gt;基になるkmlファイルをGradsで作成する。やり方は&lt;a href="http://oceansciencehack.blogspot.com/2010/09/8500hpa.html"&gt;以前の記事&lt;/a&gt;と同じだ。&lt;br /&gt;&lt;pre class="prettyprint"&gt;*************KML&lt;br /&gt;"reinit"&lt;br /&gt;"sdfopen http://www.esrl.noaa.gov/psd/thredds/dodsC//Datasets/ncep.reanalysis.de&lt;br /&gt;rived/surface/air.mon.mean.nc"&lt;br /&gt;"set time aug2010"&lt;br /&gt;"set x 1 144"&lt;br /&gt;"set y 1 73"&lt;br /&gt;"set kml airtemp"&lt;br /&gt;"set gxout  kml"&lt;br /&gt;"d air"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;以下のようなkmlファイルが出来る。&lt;br /&gt;&lt;pre class="prettyprint"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;kml xmlns="http://www.opengis.net/kml/2.2"&amp;gt;&lt;br /&gt;  &amp;lt;GroundOverlay&amp;gt;&lt;br /&gt;    &amp;lt;name&amp;gt;Monthly Mean Air Temperature&amp;lt;/name&amp;gt;&lt;br /&gt;    &amp;lt;Icon&amp;gt;&lt;br /&gt;      &amp;lt;href&amp;gt;airtemp.tif&amp;lt;/href&amp;gt;&lt;br /&gt;    &amp;lt;/Icon&amp;gt;&lt;br /&gt;    &amp;lt;LatLonBox&amp;gt;&lt;br /&gt;      &amp;lt;west&amp;gt;     -1.25&amp;lt;/west&amp;gt;&lt;br /&gt;      &amp;lt;east&amp;gt;    358.75&amp;lt;/east&amp;gt;&lt;br /&gt;      &amp;lt;south&amp;gt;    -91.25&amp;lt;/south&amp;gt;&lt;br /&gt;      &amp;lt;north&amp;gt;     91.25&amp;lt;/north&amp;gt;&lt;br /&gt;      &amp;lt;rotation&amp;gt;0.0&amp;lt;/rotation&amp;gt;&lt;br /&gt;    &amp;lt;/LatLonBox&amp;gt;&lt;br /&gt;  &amp;lt;/GroundOverlay&amp;gt;&lt;br /&gt;&amp;lt;/kml&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;u&gt;手順３&lt;/u&gt;&lt;br /&gt;kmlファイルを以下の様に書き換える。&lt;br /&gt;ポイントは&lt;br /&gt;&lt;style type="text/css"&gt;p { margin-bottom: 0.&lt;/style&gt;&lt;br /&gt;・&lt;span style="background-color: #f3f3f3;"&gt;GroundOverlay&lt;/span&gt;から&lt;span style="background-color: #f3f3f3;"&gt;/GraoundOverlay&lt;/span&gt;の部分を図の数だけ繰り返す。 &lt;br /&gt;・それぞれ図の名前を指定する。 &lt;br /&gt;・図がどの時間を占めるべきか&lt;span style="background-color: #f3f3f3;"&gt;TimeSpan&lt;/span&gt; &lt;span style="background-color: #f3f3f3;"&gt;/TimeSpan&lt;/span&gt;の部分で指定する。なお、今の場合、図は8月だけの図であるが、アニメーションで図が続く様に１年中同じ図が表示されるよう、１月１日から12月31日をTimeSpanで設定している。  &lt;br /&gt;・繰り返しの全体を&lt;span style="background-color: #f3f3f3;"&gt;Folder&lt;/span&gt; と&lt;span style="background-color: #f3f3f3;"&gt;/Folder&lt;/span&gt;ではさむ。　&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;kml xmlns="http://www.opengis.net/kml/2.2"&amp;gt;&lt;br /&gt;&amp;lt;Folder&amp;gt;&lt;br /&gt;  &amp;lt;GroundOverlay&amp;gt;&lt;br /&gt;    &amp;lt;name&amp;gt;Monthly Longterm Mean of Air Temperature&amp;lt;/name&amp;gt;&lt;br /&gt;    &amp;lt;TimeSpan&amp;gt;&lt;br /&gt;      &amp;lt;begin&amp;gt;2008-01-01&amp;lt;/begin&amp;gt;&lt;br /&gt;      &amp;lt;end&amp;gt;  2008-12-31&amp;lt;/end&amp;gt;&lt;br /&gt;    &amp;lt;/TimeSpan&amp;gt;&lt;br /&gt;    &amp;lt;Icon&amp;gt;&lt;br /&gt;      &amp;lt;href&amp;gt;airtemp_2008aug.png&amp;lt;/href&amp;gt;&lt;br /&gt;    &amp;lt;/Icon&amp;gt;&lt;br /&gt;    &amp;lt;LatLonBox&amp;gt;&lt;br /&gt;      &amp;lt;west&amp;gt;     -1.25&amp;lt;/west&amp;gt;&lt;br /&gt;      &amp;lt;east&amp;gt;    358.75&amp;lt;/east&amp;gt;&lt;br /&gt;      &amp;lt;south&amp;gt;    -91.25&amp;lt;/south&amp;gt;&lt;br /&gt;      &amp;lt;north&amp;gt;     91.25&amp;lt;/north&amp;gt;&lt;br /&gt;      &amp;lt;rotation&amp;gt;0.0&amp;lt;/rotation&amp;gt;&lt;br /&gt;    &amp;lt;/LatLonBox&amp;gt;&lt;br /&gt;  &amp;lt;/GroundOverlay&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;GroundOverlay&amp;gt;&lt;br /&gt;    &amp;lt;name&amp;gt;Monthly Longterm Mean of Air Temperature&amp;lt;/name&amp;gt;&lt;br /&gt;    &amp;lt;TimeSpan&amp;gt;&lt;br /&gt;      &amp;lt;begin&amp;gt;2009-01-01&amp;lt;/begin&amp;gt;&lt;br /&gt;      &amp;lt;end&amp;gt;  2009-12-31&amp;lt;/end&amp;gt;&lt;br /&gt;    &amp;lt;/TimeSpan&amp;gt;&lt;br /&gt;    &amp;lt;Icon&amp;gt;&lt;br /&gt;      &amp;lt;href&amp;gt;airtemp_2009aug.png&amp;lt;/href&amp;gt;&lt;br /&gt;    &amp;lt;/Icon&amp;gt;&lt;br /&gt;    &amp;lt;LatLonBox&amp;gt;&lt;br /&gt;      &amp;lt;west&amp;gt;     -1.25&amp;lt;/west&amp;gt;&lt;br /&gt;      &amp;lt;east&amp;gt;    358.75&amp;lt;/east&amp;gt;&lt;br /&gt;      &amp;lt;south&amp;gt;    -91.25&amp;lt;/south&amp;gt;&lt;br /&gt;      &amp;lt;north&amp;gt;     91.25&amp;lt;/north&amp;gt;&lt;br /&gt;      &amp;lt;rotation&amp;gt;0.0&amp;lt;/rotation&amp;gt;&lt;br /&gt;    &amp;lt;/LatLonBox&amp;gt;&lt;br /&gt;  &amp;lt;/GroundOverlay&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;GroundOverlay&amp;gt;&lt;br /&gt;    &amp;lt;name&amp;gt;Monthly Longterm Mean of Air Temperature&amp;lt;/name&amp;gt;&lt;br /&gt;    &amp;lt;TimeSpan&amp;gt;&lt;br /&gt;      &amp;lt;begin&amp;gt;2010-01-01&amp;lt;/begin&amp;gt;&lt;br /&gt;      &amp;lt;end&amp;gt;  2010-12-31&amp;lt;/end&amp;gt;&lt;br /&gt;    &amp;lt;/TimeSpan&amp;gt;&lt;br /&gt;    &amp;lt;Icon&amp;gt;&lt;br /&gt;      &amp;lt;href&amp;gt;airtemp_2010aug.png&amp;lt;/href&amp;gt;&lt;br /&gt;    &amp;lt;/Icon&amp;gt;&lt;br /&gt;    &amp;lt;LatLonBox&amp;gt;&lt;br /&gt;      &amp;lt;west&amp;gt;     -1.25&amp;lt;/west&amp;gt;&lt;br /&gt;      &amp;lt;east&amp;gt;    358.75&amp;lt;/east&amp;gt;&lt;br /&gt;      &amp;lt;south&amp;gt;    -91.25&amp;lt;/south&amp;gt;&lt;br /&gt;      &amp;lt;north&amp;gt;     91.25&amp;lt;/north&amp;gt;&lt;br /&gt;      &amp;lt;rotation&amp;gt;0.0&amp;lt;/rotation&amp;gt;&lt;br /&gt;    &amp;lt;/LatLonBox&amp;gt;&lt;br /&gt;  &amp;lt;/GroundOverlay&amp;gt;&lt;br /&gt;&amp;lt;/Folder&amp;gt;&lt;br /&gt;&amp;lt;/kml&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;出来たファイルをkmzにまとめたものを&lt;a href="https://sites.google.com/site/drtorumiyama/climate-monitor/google-earth/sample-1/airtemp_aug.kmz"&gt;こちら&lt;/a&gt;に置いた。kmzファイルはkmlと図をまとめたもので、Google Earthで一度kmlファイルを開いて、「名前をつけて保存」で作成できる。&lt;br /&gt;&lt;br /&gt;Google Earthで開くとこんな感じ。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_DVivl99_vFE/TMmSieVKFGI/AAAAAAAAAnI/Q-9j5k4VUDI/s1600/capture.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="282" src="http://3.bp.blogspot.com/_DVivl99_vFE/TMmSieVKFGI/AAAAAAAAAnI/Q-9j5k4VUDI/s320/capture.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=climatechange-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as1&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;md=1X69VDGQCMF7Z30FM082&amp;amp;asins=4774129305" style="height: 240px; width: 120px;"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-643092323436744546?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/643092323436744546/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=643092323436744546' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/643092323436744546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/643092323436744546'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/10/google-earth.html' title='Google Earthでアニメーション'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_DVivl99_vFE/TMk96Tv0VCI/AAAAAAAAAnE/1FoF7bVfU1U/s72-c/airtemp_2008aug.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-7811341247355320767</id><published>2010-10-25T08:54:00.000+09:00</published><updated>2010-10-25T08:54:32.096+09:00</updated><title type='text'>Ubuntu 10.10にアップグレードメモ</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="mailto:http://www.ubuntulinux.jp/"&gt;Ubuntuを10.10&lt;/a&gt;にアップグレードした。&lt;br /&gt;順調にアップグレードしてくれると思ったらあまかった。&lt;br /&gt;再起動後GUIの画面が始まらず、CUIでログインできるだけ。&lt;br /&gt;リカバリーモードさえうまくいかない。 &lt;br /&gt;その夜はそれ以上進まず、諦めて寝ることにした。&lt;br /&gt;次の日ネットで調べたら以下の情報を見つけた。&lt;br /&gt;&lt;br /&gt;After upgrade to 10.10 no GUI just command line&lt;br /&gt;&lt;a href="http://ubuntuforums.org/showthread.php?t=1575262"&gt;http://ubuntuforums.org/showthread.php?t=1575262&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;これに書いてある中で、  fglrxを消すというのが効果があった。&lt;br /&gt;これで、リカバリーモードのSafe Graphics ModeでGUIが出てくるようになった。&lt;br /&gt;あとは再起動やアップグレードをしているうちに、ちゃんと正常に動くようになった。&lt;br /&gt;良かった、良かった。 &lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-7811341247355320767?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/7811341247355320767/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=7811341247355320767' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7811341247355320767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7811341247355320767'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/10/ubuntu-1010.html' title='Ubuntu 10.10にアップグレードメモ'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-6065690124912697339</id><published>2010-10-07T23:48:00.000+09:00</published><updated>2010-10-07T23:48:05.462+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>富士山の初冠雪日(2)  続・トレンド</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/10/2.html"&gt;前回&lt;/a&gt;の続きとして、私自身あまりよく理解しているとは言えないが、&lt;a href="http://kashino.exblog.jp/10742634/"&gt;ココ&lt;/a&gt;を参考にして、ロバスト推定でも線形回帰をとってみた。&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: lightcyan;"&gt;参考：&lt;br /&gt;ロバスト推定（統計数理研究所）&lt;br /&gt;&lt;a href="http://www.ism.ac.jp/%7Efujisawa/research/robust.html"&gt;http://www.ism.ac.jp/~fujisawa/research/robust.html&lt;/a&gt;&lt;br /&gt;ロバスト推定（朱鷺の社）&lt;br /&gt;&lt;a href="http://ibisforest.org/index.php?%E3%83%AD%E3%83%90%E3%82%B9%E3%83%88%E6%8E%A8%E5%AE%9A"&gt;http://ibisforest.org/index.php?%E3%83%AD%E3%83%90%E3%82%B9%E3%83%88%E6%8E%A8%E5%AE%9A&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Rのパッケージ&lt;a href="http://cran.r-project.org/web/packages/robustbase/index.html"&gt;robustbase&lt;/a&gt;を使うために&lt;br /&gt;&lt;pre class="prettyprint"&gt;install.packages("robustbase")&lt;br /&gt;&lt;/pre&gt;を行っておく。&lt;br /&gt;以下がプログラム。&lt;br /&gt;&lt;pre class="prettyprint"&gt;import numpy as np&lt;br /&gt;import scikits.timeseries as ts&lt;br /&gt;#module&lt;br /&gt;from read_FirstSnowFuji import *&lt;br /&gt;&lt;br /&gt;#for R&lt;br /&gt;import rpy2.robjects as robjects&lt;br /&gt;&lt;br /&gt;ayear,amonth,aday= read_FirstSnowFuji()&lt;br /&gt;days=np.array([],dtype="i4")&lt;br /&gt;for  n in range(ayear.size):&lt;br /&gt;    td=ts.Date("D",year=ayear[n],month=amonth[n],day=aday[n])&lt;br /&gt;    days=np.append(days,td.day_of_year)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#for R&lt;br /&gt;ryear=robjects.FloatVector(ayear)&lt;br /&gt;rdays=robjects.FloatVector(days)&lt;br /&gt;robjects.globalEnv["ryear"] = ryear&lt;br /&gt;robjects.globalEnv["rdays"] = rdays&lt;br /&gt;&lt;br /&gt;r=robjects.r&lt;br /&gt;&lt;br /&gt;scripts="""&lt;br /&gt;library("robustbase")   #import robustbase&lt;br /&gt;png('FujiSnow_trend_robust.png')&lt;br /&gt;plot(ryear,rdays,xlab="Year",ylab="Day of year") #scatter plot &lt;br /&gt;fm&amp;lt;-lmrob(rdays ~ ryear)  # robust linear model&lt;br /&gt;abline(fm)  #plot regression line&lt;br /&gt;abline(lm(rdays ~ ryear),lty=2) # usual linear model&lt;br /&gt;dev.off()&lt;br /&gt;"""&lt;br /&gt;r(scripts)&lt;br /&gt;&lt;br /&gt;# summary&lt;br /&gt;summary=r('sm&amp;lt;-summary(fm)')&lt;br /&gt;print summary&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;以下が図。点線が前回の回帰直線、実線がrobustbaseで得られた直線である。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DVivl99_vFE/TK3Ps_k2clI/AAAAAAAAAm8/fNxwKb18q6w/s1600/FujiSnow_trend_robust.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/_DVivl99_vFE/TK3Ps_k2clI/AAAAAAAAAm8/fNxwKb18q6w/s320/FujiSnow_trend_robust.png" width="320" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;出力(print summary)は&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: lightcyan;"&gt;&lt;br /&gt;Call:&lt;br /&gt;lmrob(formula = rdays ~ ryear)&lt;br /&gt;&lt;br /&gt;Weighted Residuals:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Min&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1Q&amp;nbsp; Median&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3Q&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Max &lt;br /&gt;-57.989&amp;nbsp; -7.872&amp;nbsp; -0.125&amp;nbsp;&amp;nbsp; 5.986&amp;nbsp; 25.291 &lt;br /&gt;&lt;br /&gt;Coefficients:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Estimate Std. Error t value Pr(&amp;gt;|t|)&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;(Intercept) 76.10515&amp;nbsp;&amp;nbsp; 51.85081&amp;nbsp;&amp;nbsp; 1.468 0.144896&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;ryear&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.10154&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.02673&amp;nbsp;&amp;nbsp; 3.798 0.000234 ***&lt;br /&gt;---&lt;br /&gt;Signif. codes:&amp;nbsp; 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 &lt;br /&gt;&lt;br /&gt;Robust residual standard error: 10.03 &lt;br /&gt;Convergence in 12 IRWLS iterations&lt;br /&gt;&lt;br /&gt;Robustness weights: &lt;br /&gt;&amp;nbsp;2 observations c(21,115) are outliers with |weight| &amp;lt;= 0.00057 ( &amp;lt; 0.00085); &lt;br /&gt;&amp;nbsp;13 weights are ~= 1. The remaining 102 ones are summarized as&lt;br /&gt;&amp;nbsp;&amp;nbsp; Min. 1st Qu.&amp;nbsp; Median&amp;nbsp;&amp;nbsp;&amp;nbsp; Mean 3rd Qu.&amp;nbsp;&amp;nbsp;&amp;nbsp; Max. &lt;br /&gt;0.00365 0.88600 0.94480 0.88410 0.98680 0.99880 &lt;br /&gt;Algorithmic parameters: &lt;br /&gt;tuning.chi&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bb tuning.psi refine.tol&amp;nbsp;&amp;nbsp;&amp;nbsp; rel.tol &lt;br /&gt;&amp;nbsp;1.5476400&amp;nbsp; 0.5000000&amp;nbsp; 4.6850610&amp;nbsp; 0.0000001&amp;nbsp; 0.0000001 &lt;br /&gt;&amp;nbsp;nResample&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; max.it&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; groups&amp;nbsp;&amp;nbsp;&amp;nbsp; n.group&amp;nbsp;&amp;nbsp; best.r.s&amp;nbsp;&amp;nbsp; k.fast.s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; k.max &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 500&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 50&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 400&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 200 &lt;br /&gt;&amp;nbsp;trace.lev compute.rd &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 &lt;br /&gt;seed : int(0)&amp;nbsp; &lt;/div&gt;&lt;br /&gt;これによると回帰係数は0.10154（100年で約10日冠雪日が遅くなる）で、しかもp値が非常に小さく統計的に有意である。&lt;br /&gt;ただし、c(21,115)が外れ値、すなわち１９１４年（ayear[21-1]=1914)と２００８年（ayear[115-1]=2008）が外れ値になるのは良いとして、weightが１に近い点は13だけで、あとの外れ値を除く１０２点はweightが１以下に落とされている。&lt;br /&gt;&lt;br /&gt;これを見るために、回帰直線の係数、weightなどの数値をpythonに戻し、プロットしてみる（同じことをRでもできるはずだが、pythonのmatplotlibのほうがなれているので）。&lt;br /&gt;以下プログラム。&lt;br /&gt;robust推定で得られた回帰直線を緑線で、&lt;br /&gt;weightが1に近い点を青○で、&lt;br /&gt;weightが0.5から0.9988の間にある点を黒点、&lt;br /&gt;weightが0.00085から0.5の間にある点を赤点、&lt;br /&gt;外れ値を赤xでプロットした。&lt;br /&gt;&lt;pre class="prettyprint"&gt;#weights&lt;br /&gt;weights=r('weights&amp;lt;-sm$weights')&lt;br /&gt;weight=np.array(weights)&lt;br /&gt;&lt;br /&gt;#plot&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;plt.plot(ayear,ayear*a+b,'g-')&lt;br /&gt;range=(weight&amp;gt;0.9988)&lt;br /&gt;plt.plot(ayear[range],days[range],"bo")&lt;br /&gt;range=np.logical_and(weight&amp;lt;=0.9988,weight&amp;gt;=0.5)&lt;br /&gt;plt.plot(ayear[range],days[range],"k.")&lt;br /&gt;range=np.logical_and(weight&amp;lt;0.5,weight&amp;gt;=0.00085)&lt;br /&gt;plt.plot(ayear[range],days[range],"r.")&lt;br /&gt;range=(weight&amp;lt;0.00085)&lt;br /&gt;plt.plot(ayear[range],days[range],"rx")&lt;br /&gt;plt.xlim(ayear[0],ayear[-1]) &lt;br /&gt;plt.xlabel("year")&lt;br /&gt;plt.ylabel("day of year")&lt;br /&gt;plt.savefig("FujiSnow_trend_robust_2.png")&lt;br /&gt;plt.show()&lt;br /&gt;&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DVivl99_vFE/TK3arJcI5mI/AAAAAAAAAnA/xL7SCuFsLQ0/s1600/FujiSnow_trend_robust_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/_DVivl99_vFE/TK3arJcI5mI/AAAAAAAAAnA/xL7SCuFsLQ0/s320/FujiSnow_trend_robust_2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;ちなみに今年２０１０年の重みはweight[-1]=0.86999219949571671&lt;br /&gt;このように多数の点の重みを落とすのは統計的に良くても、物理的な理由は自明ではない。&lt;br /&gt;今回、この方法を用いたのは適当ではなかったかもしれない。&lt;br /&gt;&lt;br /&gt;前回と今回の解析で、初冠雪日にトレンドがあるかは統計的にははっきりしなかったが、初冠雪日が遅くなっていっているかもしれないという作業仮説自体は興味深いものがある。これから、将来、どのような傾向があらわれてくるだろうか？&lt;br /&gt;&lt;br /&gt;参考&lt;br /&gt;異常気象を追う 初冠雪&lt;br /&gt;&lt;a href="http://www.bioweather.net/column/essay2/aw15.htm"&gt;http://www.bioweather.net/column/essay2/aw15.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;縮小する富士山の永久凍土&lt;br /&gt;&lt;a href="http://www.fujisan-net.jp/data/article/1583.html"&gt;http://www.fujisan-net.jp/data/article/1583.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-6065690124912697339?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/6065690124912697339/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=6065690124912697339' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/6065690124912697339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/6065690124912697339'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/10/2_07.html' title='富士山の初冠雪日(2)  続・トレンド'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_DVivl99_vFE/TK3Ps_k2clI/AAAAAAAAAm8/fNxwKb18q6w/s72-c/FujiSnow_trend_robust.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-6075197615444880803</id><published>2010-10-06T00:25:00.001+09:00</published><updated>2010-10-07T23:18:10.894+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>富士山の初冠雪日(2)  トレンド</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/10/1.html"&gt;前回&lt;/a&gt;作ったモジュール(&lt;span style="color: red;"&gt;read_FirstSnowFuji&lt;/span&gt;)で初冠雪日を読み、年初からの日にち（1月１日を１とする）に変換したうえで、線形回帰を当てはめてみる。&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/02/r.html"&gt;以前&lt;/a&gt;やったように、&lt;a href="http://rpy.sourceforge.net/rpy2.html"&gt;rpy2&lt;/a&gt;を用いて、Rにデータを渡してやる。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;import numpy as np&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;import scikits.timeseries as ts&lt;br /&gt;#module&lt;br /&gt;from read_FirstSnowFuji import *&lt;br /&gt;&lt;br /&gt;#for R&lt;br /&gt;import rpy2.robjects as robjects&lt;br /&gt;&lt;br /&gt;ayear,amonth,aday= read_FirstSnowFuji()&lt;br /&gt;days=np.array([],dtype="i4")&lt;br /&gt;for  n in range(ayear.size):&lt;br /&gt;    td=ts.Date("D",year=ayear[n],month=amonth[n],day=aday[n])&lt;br /&gt;    days=np.append(days,td.day_of_year)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#for R&lt;br /&gt;ryear=robjects.FloatVector(ayear)&lt;br /&gt;rdays=robjects.FloatVector(days)&lt;br /&gt;robjects.globalEnv["ryear"] = ryear&lt;br /&gt;robjects.globalEnv["rdays"] = rdays&lt;br /&gt;r=robjects.r&lt;br /&gt;&lt;br /&gt;scripts="""&lt;br /&gt;png('FujiSnow_trend.png')&lt;br /&gt;plot(ryear,rdays,xlab="Year",ylab="Day of year") # scatter plot&lt;br /&gt;fm&amp;lt;-lm(rdays ~ ryear) # linear model&lt;br /&gt;abline(fm) # plot regression line                 &lt;br /&gt;dev.off()             &lt;br /&gt;"""&lt;br /&gt;r(scripts)&lt;br /&gt;summary=r('sm&amp;lt;-summary(fm)')&lt;br /&gt;print summary&lt;br /&gt;&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_DVivl99_vFE/TKs_LxPnFNI/AAAAAAAAAm4/9y00QNNck34/s1600/FujiSnow_trend.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_DVivl99_vFE/TKs_LxPnFNI/AAAAAAAAAm4/9y00QNNck34/s320/FujiSnow_trend.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;出力(print summary)は &lt;br /&gt;&lt;div style="background-color: lightcyan;"&gt;Call:&lt;br /&gt;lm(formula = rdays ~ ryear)&lt;br /&gt;&lt;br /&gt;Residuals:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Min&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1Q&amp;nbsp;&amp;nbsp; Median&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3Q&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Max &lt;br /&gt;-54.2679&amp;nbsp; -5.8555&amp;nbsp;&amp;nbsp; 0.9491&amp;nbsp;&amp;nbsp; 8.1001&amp;nbsp; 27.3063 &lt;br /&gt;&lt;br /&gt;Coefficients:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Estimate Std. Error t value Pr(&amp;gt;|t|)&amp;nbsp; &lt;br /&gt;(Intercept) 138.25153&amp;nbsp;&amp;nbsp; 71.89542&amp;nbsp;&amp;nbsp; 1.923&amp;nbsp;&amp;nbsp; 0.0570 .&lt;br /&gt;ryear&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.06873&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.03683&amp;nbsp;&amp;nbsp; 1.866&amp;nbsp;&amp;nbsp; 0.0645 .&lt;br /&gt;---&lt;br /&gt;Signif. codes:&amp;nbsp; 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 &lt;br /&gt;&lt;br /&gt;Residual standard error: 13.45 on 115 degrees of freedom&lt;br /&gt;Multiple R-squared: 0.0294,&amp;nbsp;&amp;nbsp;&amp;nbsp; Adjusted R-squared: 0.02096 &lt;br /&gt;F-statistic: 3.484 on 1 and 115 DF,&amp;nbsp; p-value: 0.06453 &lt;/div&gt;&lt;br /&gt;係数が0.06873/yearだから、100年に一週間ほどのトレンド（初冠雪日が遅くなる）となる。ただし、p値が約0.0645であるから危険率5%でトレンドがない可能性を否定できない。データのばらつきが大きいことから、さもありなんといったところである。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-6075197615444880803?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/6075197615444880803/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=6075197615444880803' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/6075197615444880803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/6075197615444880803'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/10/2.html' title='富士山の初冠雪日(2)  トレンド'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_DVivl99_vFE/TKs_LxPnFNI/AAAAAAAAAm4/9y00QNNck34/s72-c/FujiSnow_trend.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-6159986192730773720</id><published>2010-10-01T00:04:00.000+09:00</published><updated>2010-10-01T00:04:46.437+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data'/><title type='text'>富士山の初冠雪日(1) データ取得</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div style="background-color: #fce5cd;"&gt;&lt;b&gt;富士山　一気に冬の顔 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;初冠雪、平年より６日早く&lt;/b&gt;&lt;br /&gt;山頂から８合目付近にかけてうっすらと雪をかぶった富士山＝富士吉田市上吉田甲府地方気象台は２５日、富士山が初冠雪したと発表した。平年より６日、昨年より１２日早い。独自に観測している富士吉田市も同日、昨年より１５日早く「富士山初雪化粧」を宣言した。山梨県内は２２日に甲府など３地点で最高気温が３５度以上の猛暑日を記録したばかり。富士山は早くも冬に向けての“衣替え”が始まった。&lt;br /&gt;2010年09月26日 &lt;a href="http://www.sannichi.co.jp/local/news/2010/09/26/3.html"&gt;山梨日日新聞&lt;/a&gt;　&lt;a href="http://megalodon.jp/2010-0930-2339-12/www.sannichi.co.jp/local/news/2010/09/26/3.html"&gt;web魚拓&lt;/a&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;a href="http://www.jma-net.go.jp/kofu/menu/siryo_hatsukansetsu.html"&gt;甲府気象台&lt;/a&gt;のwebページ表から、富士山初冠雪日を取得するプログラムを作る。&lt;br /&gt;以下がプログラム。&lt;br /&gt;関数 read_FirstSnowFuji()が初冠雪日を取得するモジュールで、年、月、日をnumpyの配列として返す。HTMLから表を読むのに&lt;a href="http://simbot.wordpress.com/2006/05/17/html-table-parser-using-python/"&gt;table parser&lt;/a&gt;を用いている。&lt;br /&gt;メインプログラムでは、日付を&lt;a href="http://pytseries.sourceforge.net/"&gt;scikits.timeseries&lt;/a&gt;で年初からの日にち（1月１日を１とする）に変換し、グラフにしている。平均値を黒い実線で、平均値から標準偏差（約14日）の2倍離れた値に黒点線を引いた。ばらつきがかなり大きい印象だ。今年は少しだけ平年より早い。&lt;br /&gt;&lt;br /&gt;&lt;div style="color: red;"&gt;&lt;b&gt;read_FirstSnowFuji.py&lt;/b&gt;&lt;/div&gt;&lt;pre class="prettyprint"&gt;import numpy as np&lt;br /&gt;# table parser from http://simbot.wordpress.com/2006/05/17/html-table-parser-using-python/&lt;br /&gt;from table_parser import *&lt;br /&gt;&lt;br /&gt;def read_FirstSnowFuji():&lt;br /&gt;    import urllib&lt;br /&gt;    """&lt;br /&gt;   read first snow cover day of the FUJI mountain from KOFU local meteorological observatory&lt;br /&gt;   usage:&lt;br /&gt;      year,month,day=read_FirstSnowFuji()&lt;br /&gt;   input&lt;br /&gt;      none&lt;br /&gt;   output&lt;br /&gt;      year,month,day:  first snow cover day (numpy array)&lt;br /&gt;   &lt;br /&gt;   """&lt;br /&gt;&lt;br /&gt;    f = urllib.urlopen('http://www.jma-net.go.jp/kofu/menu/siryo_hatsukansetsu.dat.html')&lt;br /&gt;    p = TableParser()&lt;br /&gt;    p.feed(f.read())&lt;br /&gt;    f.close()&lt;br /&gt;    data=p.doc # Get to the data&lt;br /&gt;&lt;br /&gt;    #get &lt;br /&gt;    year=[[],[],[]] # 3 column&lt;br /&gt;    month=[[],[],[]] # 3 column&lt;br /&gt;    day=[[],[],[]] # 3 column&lt;br /&gt;    for d in data[0][1:]:&lt;br /&gt;        for n,c in enumerate([0,4,8]):&lt;br /&gt;            if not d[c]=="":&lt;br /&gt;                year[n].append(int(d[c]))&lt;br /&gt;                mi,di=d[c+1].split("/")&lt;br /&gt;                month[n].append(int(mi))&lt;br /&gt;                day[n].append(int(di))&lt;br /&gt;    # to numpy array&lt;br /&gt;    ayear=np.array([],dtype="i4")&lt;br /&gt;    amonth=np.array([],dtype="i4")&lt;br /&gt;    aday=np.array([],dtype="i4")&lt;br /&gt;    for n in range(3):&lt;br /&gt;        ayear=np.append(ayear,year[n])&lt;br /&gt;        amonth=np.append(amonth,month[n])&lt;br /&gt;        aday=np.append(aday,day[n])&lt;br /&gt;&lt;br /&gt;    return ayear,amonth,aday&lt;br /&gt;&lt;br /&gt;############################################&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;    import matplotlib.pyplot as plt&lt;br /&gt;    import scikits.timeseries as ts&lt;br /&gt;&lt;br /&gt;    ayear,amonth,aday= read_FirstSnowFuji()&lt;br /&gt;&lt;br /&gt;    days=np.array([],dtype="i4")&lt;br /&gt;    for  n in range(ayear.size):&lt;br /&gt;        td=ts.Date("D",year=ayear[n],month=amonth[n],day=aday[n])&lt;br /&gt;        days=np.append(days,td.day_of_year)&lt;br /&gt;&lt;br /&gt;    #plot&lt;br /&gt;    plt.plot(ayear,days,"b-")&lt;br /&gt;    mean=days.mean()&lt;br /&gt;    stdp=days.mean()+2*days.std()&lt;br /&gt;    stdm=days.mean()-2*days.std()&lt;br /&gt;    plt.plot([ayear[0],ayear[-1]],[mean,mean],"k-")&lt;br /&gt;    plt.plot([ayear[0],ayear[-1]],[stdp,stdp],"k--")&lt;br /&gt;    plt.plot([ayear[0],ayear[-1]],[stdm,stdm],"k--")&lt;br /&gt;    plt.xlim(ayear[0],ayear[-1])&lt;br /&gt;    plt.xlabel("year")&lt;br /&gt;    plt.ylabel("day of year")&lt;br /&gt;    plt.savefig("FujiFirstSnow.png")&lt;br /&gt;    plt.show()&lt;br /&gt;&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_DVivl99_vFE/TKSl4t4_soI/AAAAAAAAAm0/UYLTJwqmcIc/s1600/FujiFirstSnow.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/_DVivl99_vFE/TKSl4t4_soI/AAAAAAAAAm0/UYLTJwqmcIc/s320/FujiFirstSnow.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=climatechange-22&amp;o=9&amp;p=8&amp;l=as1&amp;m=amazon&amp;f=ifr&amp;md=1X69VDGQCMF7Z30FM082&amp;asins=4789921034" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;&lt;iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=climatechange-22&amp;o=9&amp;p=8&amp;l=as1&amp;m=amazon&amp;f=ifr&amp;md=1X69VDGQCMF7Z30FM082&amp;asins=4425551117" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-6159986192730773720?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/6159986192730773720/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=6159986192730773720' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/6159986192730773720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/6159986192730773720'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/10/1.html' title='富士山の初冠雪日(1) データ取得'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_DVivl99_vFE/TKSl4t4_soI/AAAAAAAAAm0/UYLTJwqmcIc/s72-c/FujiFirstSnow.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-2202752997075361202</id><published>2010-09-27T23:11:00.000+09:00</published><updated>2010-09-27T23:11:47.068+09:00</updated><title type='text'>今年8月の500hpa高度場</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div style="background-color: #fce5cd;"&gt;&lt;b&gt;異常高温の夏、今後増加？　&lt;/b&gt;&lt;br /&gt;エルニーニョや偏西風蛇行で&lt;br /&gt;１８９８年の統計開始後最高だった今夏の高温の原因について、気象庁の「異常気象分析検討会」（会長、木本昌秀東大大気海洋研究所教授）が３日、見解をまとめた。春まで継続したエルニーニョと、夏に発生したラニーニャ両現象の相乗効果や、日本上空付近を吹く偏西風の蛇行などの複合要因を指摘した。(2010/09/03　47News)　&lt;a href="http://megalodon.jp/2010-0927-2214-39/www.47news.jp/CN/201009/CN2010090301000852.html"&gt;web魚拓 &lt;/a&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;偏西風の位置の指標としての500hpa高度場(geopotential height)をGoogle Earthでプロットしてみた。&lt;br /&gt;GradsにはGoogle Earth用のデータを作るオプションがある(version 2.0a5以降）&lt;br /&gt;&lt;a href="http://www.iges.org/grads/gadoc/gradcomdsetkml.html" target="_blank"&gt;http://www.iges.org/grads/gadoc/gradcomdsetkml.html&lt;/a&gt; &lt;br /&gt;それを用いて、NCEP NCAR/Reanalysisの今年8月のデータから画像を作るGradsスクリプトが以下の通り。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;*************KML&lt;br /&gt;"sdfopen http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis.derived/pressure/hgt.mon.mean.nc"&lt;br /&gt;"set lev 500"&lt;br /&gt;"set time aug2010"&lt;br /&gt;"set x 1 144"&lt;br /&gt;"set y 1 73"&lt;br /&gt;"set kml hgt2010aug"&lt;br /&gt;"set gxout kml"&lt;br /&gt;"d hgt"&lt;br /&gt;************FIGURE&lt;br /&gt;"c"&lt;br /&gt;"set parea 0 11 0 8.5"&lt;br /&gt;"set grid off"&lt;br /&gt;"set grads off"&lt;br /&gt;"set mproj scaled"&lt;br /&gt;"set mpdraw off"&lt;br /&gt;"set gxout shaded"&lt;br /&gt;"color 5400 5900 20 -kind blue-&amp;gt;skyblue-&amp;gt;yellow-&amp;gt;red-&amp;gt;brown"&lt;br /&gt;"d hgt"&lt;br /&gt;"printim  hgt2010aug.png x2048 y1024 -t 0"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;前半で、&lt;br /&gt;hgt2010aug.kml&lt;br /&gt;hgt2010aug.tif&lt;br /&gt;という二つのファイルが出来る。&lt;br /&gt;&lt;br /&gt;本来なら、これだけで十分なはずだが、これだと図がいまいちなので、&lt;br /&gt;&lt;a href="http://gradsusr.org/pipermail/gradsusr/2010-January/010117.html" target="_blank"&gt;http://gradsusr.org/pipermail/gradsusr/2010-January/010117.html&lt;/a&gt;&lt;br /&gt;を参考に後半で図だけを好きなように作り直す。&lt;br /&gt;その後、hgt2010aug.kmlをエディタで開いて、hgt2010aug.tifで指定しているところをhgt2010aug.pngに書き換える。&lt;br /&gt;&lt;br /&gt;後は、hgt2010aug.kmlをGoogle Earthで開けばよい。&lt;br /&gt;&lt;br /&gt;ちなみに、”set x 1 144”としているが、本来このデータはサイクリック用のグリッドが145まで用意されているが、そのままだとうまく端つながらないので、144までにしている。&lt;br /&gt;&lt;br /&gt;また、データはOPeNDAPを使いネットから直接読み、シェイドの色をcolorスクリプト&lt;br /&gt;&lt;a href="http://kodama.fubuki.info/wiki/wiki.cgi/GrADS/script/color.gs?lang=jp" target="_blank"&gt;http://kodama.fubuki.info/wiki/wiki.cgi/GrADS/script/color.gs?lang=jp&lt;/a&gt;&lt;br /&gt;で指定した。&lt;br /&gt;&lt;br /&gt;できたデータをブログに貼るために、&lt;br /&gt;Embed your Google Earth Project in your Website&lt;br /&gt;&lt;a href="http://earth.google.com/outreach/tutorial_kmlembed.html" target="_blank"&gt;http://earth.google.com/outreach/tutorial_kmlembed.html&lt;/a&gt;&lt;br /&gt;を利用した。&lt;br /&gt;データは一旦Google Earthで開いたファイルをkmz方式で保存し、&lt;a href="https://sites.google.com/site/drtorumiyama/climate-monitor/google-earth/Monthlymeangeopotentialheight.kmz"&gt;こちら&lt;/a&gt;においた。&lt;br /&gt;&lt;br /&gt;&lt;script src="http://www.gmodules.com/ig/ifr?url=http://code.google.com/apis/kml/embed/embedkmlgadget.xml&amp;amp;up_kml_url=https%3A%2F%2Fsites.google.com%2Fsite%2Fdrtorumiyama%2Fclimate-monitor%2Fgoogle-earth%2FMonthlymeangeopotentialheight.kmz&amp;amp;up_view_mode=earth&amp;amp;up_earth_2d_fallback=0&amp;amp;up_earth_fly_from_space=1&amp;amp;up_earth_show_nav_controls=1&amp;amp;up_earth_show_buildings=0&amp;amp;up_earth_show_terrain=0&amp;amp;up_earth_show_roads=0&amp;amp;up_earth_show_borders=1&amp;amp;up_earth_sphere=earth&amp;amp;up_maps_zoom_out=0&amp;amp;up_maps_default_type=map&amp;amp;synd=open&amp;amp;w=500&amp;amp;h=400&amp;amp;title=2010+Aug+500hpa+Geopotential+Height&amp;amp;border=%23ffffff%7C3px%2C1px+solid+%23999999&amp;amp;output=js"&gt;&lt;/script&gt;&lt;br /&gt;(注.firefoxでは見れないことがあるようだ。その場合は他のブラウザでためしてみてください。）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=climatechange-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as1&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;md=1X69VDGQCMF7Z30FM082&amp;amp;asins=4425551516" style="height: 240px; width: 120px;"&gt;&lt;/iframe&gt;&lt;iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=climatechange-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as1&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;md=1X69VDGQCMF7Z30FM082&amp;amp;asins=4774129305" style="height: 240px; width: 120px;"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-2202752997075361202?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/2202752997075361202/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=2202752997075361202' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/2202752997075361202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/2202752997075361202'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/09/8500hpa.html' title='今年8月の500hpa高度場'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-4595313395187347888</id><published>2010-09-25T20:26:00.000+09:00</published><updated>2010-09-25T20:26:08.113+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data'/><title type='text'>TRMM 3B42 降水データ</title><content type='html'>&lt;a href="http://www.eorc.jaxa.jp/TRMM/index_j.htm"&gt;人工衛星TRMM&lt;/a&gt;の降水データ&lt;a href="http://disc.sci.gsfc.nasa.gov/precipitation/documentation/TRMM_README/TRMM_3B42_readme.shtml"&gt;3B42&lt;/a&gt;をプロットする。&lt;br /&gt;この降水データは水平分解能0.25度で3時間ごとにデータがある。&lt;br /&gt;このデータを&lt;a href="http://mirador.gsfc.nasa.gov/index.shtml"&gt;NASA Mirador&lt;/a&gt;から&lt;a href="https://sites.google.com/site/drtorumiyama/climate-monitor/opendap"&gt;OPeNDAP&lt;/a&gt;を通して入手する。 &lt;br /&gt;以下の例は7月27日0時世界標準時（日本標準時9時）の日本付近のデータをプロットする例である。&lt;a href="http://www.weathermap.co.jp/kishojin/diary_detail.php?date=2010-07-27"&gt;この日&lt;/a&gt;は東シナ海に熱帯低気圧が存在し、それによる雨が見える。&lt;br /&gt;OPeNDAPからは&lt;a href="http://www.pyngl.ucar.edu/Nio.shtml"&gt;PyNIO&lt;/a&gt;を使ってデータを入手する。&lt;br /&gt;関数name_makerはファイルのあるURLはこういう規則だろうと推測して作ったものである。間違いかもしれないので確認すること。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;import Nio&lt;br /&gt;import numpy as np&lt;br /&gt;&lt;br /&gt;def read_TRMM_3B42(date,lon1,lon2,lat1,lat2):&lt;br /&gt;    """&lt;br /&gt;   read TRMM 3B42 3 hourly rainfall  from NASA Mirador&lt;br /&gt;&lt;br /&gt;   usage:&lt;br /&gt;      lon,lat,sst=read__TRMM_3B42(date,lon1,lon2,lat1,lat2)&lt;br /&gt;     &lt;br /&gt;   input&lt;br /&gt;     &lt;br /&gt;      date (year,month,day,hour) &lt;br /&gt;      lon1,lon2  Western,East bounday&lt;br /&gt;      lat1,lat2  South,West bounday&lt;br /&gt;   output&lt;br /&gt;      lon longitude&lt;br /&gt;      lat latitude&lt;br /&gt;      rainfall data (mm/hour)         &lt;br /&gt;    """&lt;br /&gt;#check&lt;br /&gt;    assert date[3] % 3 ==0, "Error, hour must be multiple of 3!!!"&lt;br /&gt;# open OPENDAP&lt;br /&gt;    fname=name_maker(date[0],date[1],date[2],date[3])&lt;br /&gt;    f = Nio.open_file(fname)&lt;br /&gt;## variable name check&lt;br /&gt;    #variables = f.variables.keys()&lt;br /&gt;    #print f&lt;br /&gt;    #print "variables",variables&lt;br /&gt;&lt;br /&gt;# read data&lt;br /&gt;    temp=f.variables["DATA_GRANULE.PlanetaryGrid.precipitation"]&lt;br /&gt;&lt;br /&gt;#grid&lt;br /&gt;    # grid&lt;br /&gt;    lon=-179.875+np.arange(temp.shape[1])*0.25&lt;br /&gt;    lat=-49.875 +np.arange(temp.shape[2])*0.25&lt;br /&gt;    # selection&lt;br /&gt;    xrange=np.where(np.logical_and(lon&amp;gt;=lon1,lon&amp;lt;=lon2))&lt;br /&gt;    yrange=np.where(np.logical_and(lat&amp;gt;=lat1,lat&amp;lt;=lat2))&lt;br /&gt;    &lt;br /&gt;#precipitation&lt;br /&gt;    x=xrange[0]&lt;br /&gt;    y=yrange[0]&lt;br /&gt;    precip=(temp[0,x[0]:x[-1]+1,y[0]:y[-1]+1].T).reshape((len(y),len(x)))&lt;br /&gt;&lt;br /&gt;# closing &lt;br /&gt;    f.close()&lt;br /&gt;    return lon[xrange],lat[yrange],precip&lt;br /&gt;&lt;br /&gt;############################################&lt;br /&gt;&lt;br /&gt;def name_maker(year,month,day,hour):&lt;br /&gt;    import scikits.timeseries as ts&lt;br /&gt;    #&lt;br /&gt;    t=ts.Date('H', year=year,month=month,day=day,hour=hour)&lt;br /&gt;    if t.hour==0:&lt;br /&gt;        tc=t-1&lt;br /&gt;    else:&lt;br /&gt;        tc=t&lt;br /&gt;    cyear = "%04d"  % tc.year&lt;br /&gt;    cyear2= "%02d"  % (t.year-2000)&lt;br /&gt;    cmonth2= "%02d" % t.month&lt;br /&gt;    cday2=   "%02d" % t.day&lt;br /&gt;    shour = str(t.hour)&lt;br /&gt;    yd3= "%03d" % tc.day_of_year&lt;br /&gt;    #&lt;br /&gt;    fname="http://disc2.nascom.nasa.gov/opendap/TRMM_L3//TRMM_3B42//%(cyear)s/%(yd3)s/3B42.%(cyear2)s%(cmonth2)s%(cday2)s.%(shour)s.6A.HDF.Z" %locals()&lt;br /&gt;    return fname&lt;br /&gt;&lt;br /&gt;############################################&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;    import matplotlib.pyplot as plt&lt;br /&gt;    from mpl_toolkits.basemap import Basemap&lt;br /&gt;    # example plot&lt;br /&gt;&lt;br /&gt;# range&lt;br /&gt;    lon1=120.&lt;br /&gt;    lon2=145.&lt;br /&gt;    lat1=20.&lt;br /&gt;    lat2=40.&lt;br /&gt;&lt;br /&gt;#date&lt;br /&gt;    year=2009&lt;br /&gt;    month=7&lt;br /&gt;    day=27&lt;br /&gt;    hour=0 &lt;br /&gt;    lon,lat,precip=read_TRMM_3B42(date=(year,month,day,hour),lon1=lon1,lon2=lon2,lat1=lat1,lat2=lat2)&lt;br /&gt;&lt;br /&gt;   #plot&lt;br /&gt;    vmax=int(precip.max())&lt;br /&gt;    vmin=int(precip.min())&lt;br /&gt;    fig=plt.figure()&lt;br /&gt;    ax = fig.add_axes([0.1,0.1,0.8,0.8])&lt;br /&gt;    map = Basemap(projection='merc',llcrnrlat=lat1,urcrnrlat=lat2,\&lt;br /&gt;                      llcrnrlon=lon1,urcrnrlon=lon2,resolution='i')&lt;br /&gt;    lons,lats=np.meshgrid(lon[:],lat[:])&lt;br /&gt;    x,y=map(lons,lats)&lt;br /&gt;    map.drawcoastlines()&lt;br /&gt;    map.drawmapboundary()&lt;br /&gt;    map.pcolor(x,y,precip,vmin=vmin,vmax=vmax,cmap=plt.cm.Blues)&lt;br /&gt;    ti=str(year)+"/"+str(month)+"/"+str(day)+":"+str(hour)+"Z"&lt;br /&gt;    plt.title(ti)&lt;br /&gt;# colorbar&lt;br /&gt;    pos = ax.get_position()&lt;br /&gt;    l, b, w, h = pos.bounds&lt;br /&gt;    cax = plt.axes([l+w+0.02, b, 0.03, h]) # setup colorbar axes.&lt;br /&gt;    plt.colorbar(cax=cax) # draw colorbar&lt;br /&gt;    plt.savefig("TRMM_3B42.png")&lt;br /&gt;    plt.show()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_DVivl99_vFE/TJ3VxQpdbJI/AAAAAAAAAmw/ql_WEpoy-4M/s1600/TRMM_3B42.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="241" src="http://3.bp.blogspot.com/_DVivl99_vFE/TJ3VxQpdbJI/AAAAAAAAAmw/ql_WEpoy-4M/s320/TRMM_3B42.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;参考&lt;br /&gt;NASA Giovanniのサイト&lt;br /&gt;&lt;a href="http://disc2.nascom.nasa.gov/Giovanni/tovas/TRMM_V6.3B42.2.shtml"&gt;http://disc2.nascom.nasa.gov/Giovanni/tovas/TRMM_V6.3B42.2.shtml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;TRMM 3B42 readme&lt;br /&gt;&lt;a href="ftp://meso-a.gsfc.nasa.gov/pub/trmmdocs/3B42_3B43_doc.pdf"&gt;ftp://meso-a.gsfc.nasa.gov/pub/trmmdocs/3B42_3B43_doc.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=climatechange-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as1&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;md=1X69VDGQCMF7Z30FM082&amp;amp;asins=4425551419" style="height: 240px; width: 120px;"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-4595313395187347888?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/4595313395187347888/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=4595313395187347888' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/4595313395187347888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/4595313395187347888'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/09/trmm-3b42.html' title='TRMM 3B42 降水データ'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_DVivl99_vFE/TJ3VxQpdbJI/AAAAAAAAAmw/ql_WEpoy-4M/s72-c/TRMM_3B42.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-1936290297435829815</id><published>2010-09-17T22:53:00.000+09:00</published><updated>2010-09-17T22:53:56.836+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sage'/><title type='text'>Sageで方程式を解く</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sagemath.org/"&gt;Sage&lt;/a&gt;で方程式を解いてみる。&lt;br /&gt;&lt;pre class="prettyprint"&gt;x,a,b,c=var('x a b c')&lt;br /&gt;solve(x^2+1==0,x)&lt;br /&gt;&lt;/pre&gt;&lt;pre class="shrunk"&gt;&lt;img align="middle" border="0" src="http://www.codecogs.com/gif.latex?%5Cleft[x%20=%20%5Cleft%28-i%5Cright%29,%20x%20=%20i%5Cright]" /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;f=a*x^2+b*x+c==0&lt;br /&gt;solve(f,x)&lt;br /&gt;&lt;/pre&gt;&lt;img align="middle" border="0" src="http://www.codecogs.com/gif.latex?%5Cleft[x%20=%20%5Cfrac%7B-b%20+%20%5Csqrt%7B-4%20%5C,%20a%20c%20+%20b%5E%7B2%7D%7D%7D%7B2%20%5C,%20a%7D,%20x%20=%20%5Cfrac%7B-b%20-%20%5Csqrt%7B-4%20%5C,%20a%20c%20+%20b%5E%7B2%7D%7D%7D%7B2%20%5C,%20a%7D%5Cright]" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;Q=solve(f,x)&lt;br /&gt;for q in Q:&lt;br /&gt;    q.substitute({a:1,b:-5,c:6})&lt;br /&gt;&lt;/pre&gt;&lt;img align="middle" border="0" src="http://www.codecogs.com/gif.latex?x=2" /&gt;&lt;br /&gt;&lt;img align="middle" border="0" src="http://www.codecogs.com/gif.latex?x=3" /&gt;&lt;br /&gt;&lt;br /&gt;Latexの書式を出すときには&lt;br /&gt;&lt;pre class="prettyprint"&gt;latex(_)&lt;br /&gt;&lt;/pre&gt;などとする。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-1936290297435829815?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/1936290297435829815/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=1936290297435829815' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/1936290297435829815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/1936290297435829815'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/09/sage.html' title='Sageで方程式を解く'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-9203244083525570094</id><published>2010-09-04T01:57:00.001+09:00</published><updated>2010-09-04T02:00:25.989+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='数値計算'/><title type='text'>方程式の解を指定範囲で全て探すプログラム</title><content type='html'>&lt;br /&gt;&lt;br /&gt;以下のプログラムは、方程式を関数f(x)=0で与えたときに、指定した範囲内で解を&lt;b&gt;全て&lt;/b&gt;求めることを意図したものである。&lt;br /&gt;基本は、範囲をdivの数で分割し、それぞれの領域でScipyのbrentqを適用し、解を集めている。&lt;br /&gt;しかし、関数f(x)が解の前後で符号を変えないケースがあり、このような場合の解を求めるためにNewton法も用いている。&lt;br /&gt;&lt;br /&gt;f1d_solve_range.py&lt;br /&gt;&lt;pre class="prettyprint"&gt;import numpy as np&lt;br /&gt;&lt;br /&gt;def f1d_solve_range(f,range,div=1000,args=(),newtontirigger=1.E-4):&lt;br /&gt;    """&lt;br /&gt;Solve f(x)=0 to otain all solutions between range&lt;br /&gt;range is devided by div to find solution in each subrange&lt;br /&gt;&lt;br /&gt;When |f(x)| &amp;lt; 1.E-4, Newton Method is also used&lt;br /&gt;because brentq can not find solution if f(x) does not change sign at a solution.&lt;br /&gt;"""&lt;br /&gt;    from scipy.optimize import brentq,newton&lt;br /&gt;&lt;br /&gt;    x=np.linspace(range[0],range[1],div)&lt;br /&gt;    dx=x[1]-x[0] &lt;br /&gt;&lt;br /&gt;    #solution 1 by bysection&lt;br /&gt;    solution1=[]&lt;br /&gt;    for x0  in x[:-1]:&lt;br /&gt;        try:&lt;br /&gt;            a=brentq(f,x0,x0+dx,args=args)&lt;br /&gt;            solution1.append(a)&lt;br /&gt;        except:&lt;br /&gt;            continue&lt;br /&gt;    solution1=np.unique(solution1)&lt;br /&gt;&lt;br /&gt;    # solution2 by Netwon method just in case f(a) f(b) has same sign&lt;br /&gt;    solution2=[] &lt;br /&gt;    for x0 in x:&lt;br /&gt;        if np.abs(f(x0,*args))&amp;lt;newtontirigger:&lt;br /&gt;            b=newton(f,x0,args=args)&lt;br /&gt;            solution2.append(b)&lt;br /&gt;    solution2=np.unique(solution2)&lt;br /&gt;    solution2.clip(range[0],range[1])  # remove out of range&lt;br /&gt;&lt;br /&gt;    # final solution&lt;br /&gt;    solution=solution1&lt;br /&gt;    for s2 in solution2:&lt;br /&gt;        if np.alltrue(np.abs(solution-s2)&amp;gt;dx):&lt;br /&gt;            print "New solution added by Newtonian!:",s2&lt;br /&gt;            solution=np.append(solution,s2)&lt;br /&gt;    &lt;br /&gt;    return np.sort(solution)  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b style="color: red;"&gt;例１&lt;/b&gt;　&lt;img align="middle" border="0" src="http://www.codecogs.com/gif.latex?x%5E3=0" /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;#example 1&lt;br /&gt;    def f(x):&lt;br /&gt;        return x**3 &lt;br /&gt;    &lt;br /&gt;    print "ex1=",f1d_solve_range(f,(-10.,10))&lt;br /&gt;&lt;/pre&gt;結果:&lt;br /&gt;&lt;div style="background-color: #cccccc;"&gt;ex1= [ 0.]&lt;/div&gt;&lt;br /&gt;&lt;b style="color: red;"&gt;例2&lt;/b&gt;　&lt;img align="middle" border="0" src="http://www.codecogs.com/gif.latex?x%5E3-x=0" /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;#example 2&lt;br /&gt;    def f(x):&lt;br /&gt;        return x**3-x &lt;br /&gt;    print "ex2=",f1d_solve_range(f,(-10.,10)) &lt;br /&gt;&lt;/pre&gt;結果：&lt;br /&gt;&lt;span style="background-color: #cccccc;"&gt;ex2= [-1.&amp;nbsp; 0.&amp;nbsp; 1.]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style="color: red;"&gt;例3&lt;/b&gt; &lt;img align="middle" border="0" src="http://www.codecogs.com/gif.latex?x%5E3-x%5E2=0" /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;#example 3&lt;br /&gt;    def f(x):&lt;br /&gt;        return x**3-x**2 &lt;br /&gt;    print "ex3=",f1d_solve_range(f,(-10.,10)) &lt;br /&gt;    x=np.linspace(-2,2,100)&lt;br /&gt;&lt;/pre&gt;結果：&lt;br /&gt;&lt;span style="background-color: #cccccc;"&gt;ex3= New solution added by Newtonian!: 1.92717530048e-08&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #cccccc;"&gt;[&amp;nbsp; 1.92717530e-08&amp;nbsp;&amp;nbsp; 1.00000000e+00]&lt;/span&gt;&lt;br /&gt;解の前後で符号を変えないケースでNewton法で解が求まっている。&lt;br /&gt;&lt;img align="middle" border="0" src="http://www.codecogs.com/gif.latex?x%5E3-x%5E2" /&gt;&lt;br /&gt;のグラフを参照&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_DVivl99_vFE/TIEnQcM_BAI/AAAAAAAAAmk/D7nlQN8ccc0/s1600/line.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/_DVivl99_vFE/TIEnQcM_BAI/AAAAAAAAAmk/D7nlQN8ccc0/s320/line.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: red;"&gt;例4&lt;/span&gt;&lt;/b&gt; &lt;img align="middle" border="0" src="http://www.codecogs.com/gif.latex?x%5E2+1=0" /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;#example 4&lt;br /&gt;    def f(x):&lt;br /&gt;        return x**2+1 &lt;br /&gt;    print "ex4=",f1d_solve_range(f,(-10.,10)) &lt;br /&gt;&lt;/pre&gt;結果：&lt;br /&gt;&lt;div style="background-color: #cccccc;"&gt;ex4= []&lt;/div&gt;解なし。&lt;br /&gt;&lt;br /&gt;&lt;b style="color: red;"&gt;例5&lt;/b&gt; &lt;img align="middle" border="0" src="http://www.codecogs.com/gif.latex?ax%5E2+2bx+c=0,a=1,b=2,c=1" /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;#example 5&lt;br /&gt;    def f(x,a,b,c):&lt;br /&gt;        return a*x**2 + b*x +c &lt;br /&gt;    print "ex5=",f1d_solve_range(f,(-10.,10),args=(1,2,1)) &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;結果:&lt;br /&gt;&lt;span style="background-color: #cccccc;"&gt;ex5= New solution added by Newtonian!: -0.999999982865&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #cccccc;"&gt;[-0.99999998]&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-9203244083525570094?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/9203244083525570094/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=9203244083525570094' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/9203244083525570094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/9203244083525570094'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/09/s.html' title='方程式の解を指定範囲で全て探すプログラム'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_DVivl99_vFE/TIEnQcM_BAI/AAAAAAAAAmk/D7nlQN8ccc0/s72-c/line.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-8378482314852942190</id><published>2010-09-04T00:17:00.003+09:00</published><updated>2010-09-04T00:27:05.581+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data'/><title type='text'>EORC MODIS SST</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://kuroshio.eorc.jaxa.jp/ADEOS/mod_nrt_new/index.html"&gt;JAXA EORC提供のMODIS SST&lt;/a&gt;をプロットするスクリプトを作成した。&lt;br /&gt;&lt;a href="http://kuroshio.eorc.jaxa.jp/ADEOS/mod_nrt_new/html/03_data_binary.html"&gt;データのバイナリ&lt;/a&gt;はEORCに提供していただいた。&lt;br /&gt;下の例ではは2010年8月2日の&lt;a href="http://kuroshio.eorc.jaxa.jp/ADEOS/mod_nrt_new/image/area.jpg"&gt;領域&lt;/a&gt;６のデータから紀伊半島付近をプロットしている。A2GL1&lt;b style="color: red;"&gt;100802&lt;/b&gt;0431OD1_OSTAQ_01000_01000_sst_&lt;span style="color: blue;"&gt;06&lt;/span&gt;&lt;br /&gt;ファイルのフォーマットの情報は&lt;a href="http://kuroshio.eorc.jaxa.jp/ADEOS/mod_nrt_new/PDF/MODISform.pdf"&gt;ここ&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;import numpy as np&lt;br /&gt;&lt;br /&gt;def read_MODIS_EORC(file,lon1,lon2,lat1,lat2):&lt;br /&gt;    """&lt;br /&gt;   read MODIS_SST from EORC&lt;br /&gt;&lt;br /&gt;   usage:&lt;br /&gt;      lon,lat,sst=read_MODIS_EORC(file,lon1,lon2,lat1,lat2)&lt;br /&gt;     &lt;br /&gt;   input&lt;br /&gt;     &lt;br /&gt;      file filename &lt;br /&gt;      lon1,lon2  Western,East bounday&lt;br /&gt;      lat1,lat2  South,West bounday&lt;br /&gt;   output&lt;br /&gt;      lon longitude&lt;br /&gt;      lat latitude&lt;br /&gt;      SST sst data (masked array) in C          &lt;br /&gt;    """&lt;br /&gt;    # open file&lt;br /&gt;    f=open(file, 'r')&lt;br /&gt;    # read header&lt;br /&gt;    pixel=f.read(6); print "pixel=",pixel&lt;br /&gt;    line=f.read(6); print "line=",line&lt;br /&gt;    nwlon=f.read(8); print "NW lon.=",nwlon&lt;br /&gt;    nwlat=f.read(8); print "NW lat.=",nwlat&lt;br /&gt;    res=f.read(8);   print "resolution=",res&lt;br /&gt;    slope=f.read(9);   print "slope=",slope&lt;br /&gt;    offset=f.read(9);  print "ofset=",offset&lt;br /&gt;    dummy=f.read(1)&lt;br /&gt;    parameter=f.read(8); print "parameter name=",parameter&lt;br /&gt;    dummy=f.read(1)&lt;br /&gt;    filename=f.read(45); print "file name=",filename&lt;br /&gt;    f.close()&lt;br /&gt;    # read data&lt;br /&gt;    f=open(file,'r')&lt;br /&gt;    f.seek(int(pixel)*2) #skip header&lt;br /&gt;    data=np.fromfile(f,dtype="&amp;gt;u2")&lt;br /&gt;    data=data.reshape((int(line),int(pixel)))&lt;br /&gt;    msk=np.logical_or(data==0,data&amp;gt;=65534) # 0 cloud, 65534 out of obs., 65535 land &lt;br /&gt;    data=np.ma.masked_array(data[::-1],mask=msk[::-1,:])&lt;br /&gt;    data=data*float(slope)+float(offset)-273.15 # to degree C&lt;br /&gt;    f.close()&lt;br /&gt;    # grid&lt;br /&gt;    lon=float(nwlon)+np.arange(int(pixel))*float(res)&lt;br /&gt;    lat=float(nwlat)-np.arange(int(line))*float(res)&lt;br /&gt;    lat=lat[::-1]&lt;br /&gt;    # selection&lt;br /&gt;    xrange=np.logical_and(lon&amp;gt;=lon1,lon&amp;lt;=lon2)&lt;br /&gt;    yrange=np.logical_and(lat&amp;gt;=lat1,lat&amp;lt;=lat2)&lt;br /&gt;    sst=(data[yrange,:])[:,xrange] &lt;br /&gt;&lt;br /&gt;    return lon[xrange],lat[yrange], sst&lt;br /&gt;&lt;br /&gt;############################################&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;    import matplotlib.pyplot as plt&lt;br /&gt;    from mpl_toolkits.basemap import Basemap&lt;br /&gt;    # example plot&lt;br /&gt;&lt;br /&gt;    #read data&lt;br /&gt;    filename="A2GL11008020431OD1_OSTAQ_01000_01000_sst_06"&lt;br /&gt;    lon1=135.&lt;br /&gt;    lon2=138.&lt;br /&gt;    lat1=32.&lt;br /&gt;    lat2=35.&lt;br /&gt;    lon,lat,sst=read_MODIS_EORC(filename,lon1,lon2,lat1,lat2)&lt;br /&gt;&lt;br /&gt;    #plot&lt;br /&gt;    tmax=int(sst.max())&lt;br /&gt;    tmin=int(sst.min())&lt;br /&gt;    fig=plt.figure()&lt;br /&gt;    ax = fig.add_axes([0.1,0.1,0.8,0.8])&lt;br /&gt;    map = Basemap(projection='merc',llcrnrlat=lat1,urcrnrlat=lat2,\&lt;br /&gt;                      llcrnrlon=lon1,urcrnrlon=lon2,resolution='i')&lt;br /&gt;    lons,lats=np.meshgrid(lon[:],lat[:])&lt;br /&gt;    x,y=map(lons,lats)&lt;br /&gt;    map.drawcoastlines()&lt;br /&gt;    map.drawmapboundary()&lt;br /&gt;    map.pcolor(x,y,sst,vmin=tmin,vmax=tmax)&lt;br /&gt;# colorbar&lt;br /&gt;    pos = ax.get_position()&lt;br /&gt;    l, b, w, h = pos.bounds&lt;br /&gt;    cax = plt.axes([l+w+0.02, b, 0.03, h]) # setup colorbar axes.&lt;br /&gt;    plt.colorbar(cax=cax) # draw colorbar&lt;br /&gt;    plt.savefig("MODIS_EORC_SST.png")&lt;br /&gt;    plt.show()&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_DVivl99_vFE/TIEPtAB47MI/AAAAAAAAAmg/zDlCEGUtGMI/s1600/MODIS_EORC_SST.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/_DVivl99_vFE/TIEPtAB47MI/AAAAAAAAAmg/zDlCEGUtGMI/s320/MODIS_EORC_SST.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;謝辞&lt;br /&gt;ここで用いたSSTバイナリは宇宙航空研究開発機構(JAXA)地球観測研究センター(&lt;span class="il"&gt;EORC&lt;/span&gt;)から提供されたものである。ここに感謝する。&lt;br /&gt;&lt;br /&gt;関連ポスト&lt;br /&gt;MODIS aqua Global Level 3 Mapped Mid-IR SST (4km)&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/09/modis-aqua-global-level-3-mapped-mid-ir.html"&gt;http://oceansciencehack.blogspot.com/2010/09/modis-aqua-global-level-3-mapped-mid-ir.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;参考&lt;br /&gt;MODIS EORC SST FAQ &lt;br /&gt;&lt;a href="http://kuroshio.eorc.jaxa.jp/ADEOS/mod_nrt_new/html/05_faq.html"&gt;http://kuroshio.eorc.jaxa.jp/ADEOS/mod_nrt_new/html/05_faq.html&lt;/a&gt;&lt;br /&gt;JAXA　MODISページ&lt;br /&gt;&lt;a href="http://www.eorc.jaxa.jp/hatoyama/satellite/sendata/modis_j.html"&gt;http://www.eorc.jaxa.jp/hatoyama/satellite/sendata/modis_j.html&lt;/a&gt;&lt;br /&gt;MODIS wikipedia&lt;br /&gt;&lt;a href="http://ja.wikipedia.org/wiki/MODIS"&gt;http://ja.wikipedia.org/wiki/MODIS&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-8378482314852942190?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/8378482314852942190/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=8378482314852942190' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/8378482314852942190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/8378482314852942190'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/09/eorc-modis-sst.html' title='EORC MODIS SST'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_DVivl99_vFE/TIEPtAB47MI/AAAAAAAAAmg/zDlCEGUtGMI/s72-c/MODIS_EORC_SST.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-924555647939618533</id><published>2010-09-03T05:44:00.001+09:00</published><updated>2010-09-04T00:28:20.566+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data'/><title type='text'>CEReS NOAA/AVHRR SST</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cr.chiba-u.jp/%7Edatabase-jp/wiki/wiki.cgi?page=CEReS+NOAA%2FAVHRR+Product"&gt;CEReSで配布しているNOAA AVHRR SST&lt;/a&gt;をプロットしてみた。&lt;br /&gt;&lt;br /&gt;FTPサイトからデータをダウンロードして、解凍する。&lt;br /&gt;ここでは n1810080316.sst.giを利用する。&lt;br /&gt;(NOAA 18 ,2010年,8月3日,16世界標準時）&lt;br /&gt;以下がスクリプト。&lt;br /&gt;このデータには雲や陸地のマスクはないようだ。 &lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/09/modis-aqua-global-level-3-mapped-mid-ir.html"&gt;前回&lt;/a&gt;はPyNGLでプロットしたが、今回は&lt;a href="http://matplotlib.sourceforge.net/basemap/doc/html/"&gt;matplotlib basemap toolkit&lt;/a&gt;を利用した。&lt;br /&gt;matlabのpplot関数に対応する関数を使いたかったからだ（PyNGLにはあるのかな？）。 &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;import numpy as np&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;&lt;br /&gt;def read_CEReS_SST(dir,file,lon1,lon2,lat1,lat2):&lt;br /&gt;    """&lt;br /&gt;   read CERes SST&lt;br /&gt;   usage:&lt;br /&gt;      lon,lat,sst=read_CEReS_SST(dir,file,lon1,lon2,lat1,lat2)     &lt;br /&gt;   input&lt;br /&gt;      dir working dir&lt;br /&gt;      file filename &lt;br /&gt;           gzipped file is fine.&lt;br /&gt;           URL also works&lt;br /&gt;      lon1,lon2  Western,East bounday&lt;br /&gt;      lat1,lat2  South,West bounday&lt;br /&gt;   output&lt;br /&gt;      lon longitude&lt;br /&gt;      lat latitude&lt;br /&gt;      SST sst data (masked array) in C          &lt;br /&gt;    """&lt;br /&gt;    # read data&lt;br /&gt;    ds=np.DataSource(dir)&lt;br /&gt;    f=ds.open(file, 'r')&lt;br /&gt;    f.seek(80) # skip header&lt;br /&gt;    ssttemp=np.frombuffer(f.read(),dtype="&amp;gt;i2",count=6378*5562)&lt;br /&gt;    f.close()&lt;br /&gt;    # as masked array&lt;br /&gt;    sst=ssttemp.reshape((5562,6378))*0.1&lt;br /&gt;    sst=np.ma.masked_array(sst[::-1,:],mask=(sst[::-1,:]==0  ))&lt;br /&gt;&lt;br /&gt;    # grid&lt;br /&gt;    lon=100.+np.arange(6378)*0.01097869&lt;br /&gt;    lat=9.97971+np.arange(5562)*0.00899322&lt;br /&gt;    # selection&lt;br /&gt;    xrange=np.logical_and(lon&amp;gt;=lon1,lon&amp;lt;=lon2)&lt;br /&gt;    yrange=np.logical_and(lat&amp;gt;=lat1,lat&amp;lt;=lat2)&lt;br /&gt;    sst=(sst[yrange,:])[:,xrange]-273.15 # Kelvin to C&lt;br /&gt;&lt;br /&gt;    return lon[xrange],lat[yrange], sst&lt;br /&gt;############################################&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;    from mpl_toolkits.basemap import Basemap&lt;br /&gt;    # example plot&lt;br /&gt;&lt;br /&gt;    #read data&lt;br /&gt;    filename="n1810080316.sst.gi"&lt;br /&gt;    lon1=130.&lt;br /&gt;    lon2=140.&lt;br /&gt;    lat1=30.&lt;br /&gt;    lat2=36.&lt;br /&gt;    lon,lat,sst=read_CEReS_SST(".",filename,lon1,lon2,lat1,lat2)&lt;br /&gt;&lt;br /&gt;    #plot&lt;br /&gt;    tmax=30.&lt;br /&gt;    tmin=20.&lt;br /&gt;    fig=plt.figure()&lt;br /&gt;    ax = fig.add_axes([0.1,0.1,0.8,0.8])&lt;br /&gt;    map = Basemap(projection='merc',llcrnrlat=lat1,urcrnrlat=lat2,\&lt;br /&gt;                      llcrnrlon=lon1,urcrnrlon=lon2,resolution='i')&lt;br /&gt;    lons,lats=np.meshgrid(lon[:],lat[:])&lt;br /&gt;    x,y=map(lons,lats)&lt;br /&gt;    map.drawcoastlines()&lt;br /&gt;    map.drawmapboundary()&lt;br /&gt;    map.pcolor(x,y,sst,vmin=tmin,vmax=tmax)&lt;br /&gt; # colorbar&lt;br /&gt;    pos = ax.get_position()&lt;br /&gt;    l, b, w, h = pos.bounds&lt;br /&gt;    cax = plt.axes([l+w+0.02, b, 0.03, h]) # setup colorbar axes.&lt;br /&gt;    plt.colorbar(cax=cax) # draw colorbar&lt;br /&gt;    plt.savefig("CEReS_SST.png")&lt;br /&gt;    plt.show()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DVivl99_vFE/TH33uMOeMTI/AAAAAAAAAmc/KC_rzyHZqNk/s1600/CEReS_SST.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="241" src="http://1.bp.blogspot.com/_DVivl99_vFE/TH33uMOeMTI/AAAAAAAAAmc/KC_rzyHZqNk/s320/CEReS_SST.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-924555647939618533?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/924555647939618533/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=924555647939618533' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/924555647939618533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/924555647939618533'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/09/ceres-noaaavhrr-sst.html' title='CEReS NOAA/AVHRR SST'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_DVivl99_vFE/TH33uMOeMTI/AAAAAAAAAmc/KC_rzyHZqNk/s72-c/CEReS_SST.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-5044073374506009831</id><published>2010-09-01T21:52:00.000+09:00</published><updated>2010-09-01T21:52:16.465+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data'/><title type='text'>MODIS aqua Global Level 3 Mapped Mid-IR SST (4km)</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="ftp://podaac.jpl.nasa.gov/pub/documents/dataset_docs/modis_sst.html"&gt;MODIS aqua Global Level 3 Mapped Mid-IR 海水面温度&lt;/a&gt;を&lt;a href="http://www.pyngl.ucar.edu/Nio.shtml"&gt;PyNIO&lt;/a&gt;で読み込み、&lt;a href="http://www.pyngl.ucar.edu/"&gt;PyNGL&lt;/a&gt;でプロットした(daily, 4km)。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;データは&lt;a href="http://podaac.jpl.nasa.gov/DATA_PRODUCT/SST/index.html"&gt;NASA PO.DAACのサイト&lt;/a&gt;の&lt;a href="ftp://podaac.jpl.nasa.gov/pub/sea_surface_temperature/modis/data/aqua/L3_mapped/sst4/"&gt;FTPサイト&lt;/a&gt;より、&lt;a href="ftp://podaac.jpl.nasa.gov/pub/sea_surface_temperature/modis/data/aqua/L3_mapped/sst4/daily/04km/2010/215/"&gt;8月3日のデータ&lt;/a&gt;を入手し(A2010215.L3m_DAY_SST4_4.bz2)、bunzip2で解凍しておく。&lt;br /&gt;データはhdf4フォーマットである。&lt;br /&gt;&lt;br /&gt;以下がスクリプト。&lt;br /&gt;SSTは変数名"l3m_data"でunsigned 16bit integer&lt;br /&gt;クオリティフラッグが変数名"l3m__qual"でunsigned 8bit integer&lt;br /&gt;これらは&lt;a href="http://www.hdfgroup.org/hdf-java-html/hdfview/"&gt;HDFVIEW &lt;/a&gt;で確かめた。&lt;br /&gt;クオリティフラッグが0以外は欠損値とした。&lt;br /&gt;データは、南北が逆になっているので反転してある。 &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;import Nio&lt;br /&gt;import Ngl&lt;br /&gt;import numpy as np&lt;br /&gt;import scikits.timeseries as ts&lt;br /&gt;&lt;br /&gt;#day&lt;br /&gt;year=2010&lt;br /&gt;month=8&lt;br /&gt;day=3&lt;br /&gt;t=ts.Date("D",year=year,month=month,day=day)&lt;br /&gt;days='%03d' % t.day_of_year&lt;br /&gt;td=str(year)+"/"+str(month)+"/"+str(day)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# open file&lt;br /&gt;nfile=Nio.open_file("A%(year)s%(days)s.L3m_DAY_SST4_4" %locals(), mode='r',format="h4")&lt;br /&gt;nfile.set_option("MaskedArrayMode","MaskedNever")&lt;br /&gt;&lt;br /&gt;#grid&lt;br /&gt;lon=nfile.Westernmost_Longitude+nfile.Longitude_Step[0]*np.arange(nfile.Number_of_Columns)&lt;br /&gt;lat=nfile.Southernmost_Latitude+nfile.Latitude_Step[0]*np.arange(nfile.Number_of_Lines)&lt;br /&gt;&lt;br /&gt;#grid salection&lt;br /&gt;xrange=np.logical_and(lon&amp;gt;=130,lon&amp;lt;=140.)&lt;br /&gt;yrange=np.logical_and(lat&amp;gt;=30,lat&amp;lt;=36.)&lt;br /&gt;&lt;br /&gt;temp=nfile.variables["l3m_data"]&lt;br /&gt;flag=nfile.variables["l3m_qual"]&lt;br /&gt;&lt;br /&gt;temp2=((temp[::-1,:])[yrange,:])[:,xrange].astype("uint16")&lt;br /&gt;flag2=((flag[::-1,:])[yrange,:])[:,xrange].astype("uint8")&lt;br /&gt;&lt;br /&gt;sst=temp2*temp.Slope[0]+temp.Intercept[0]&lt;br /&gt;sst=np.ma.masked_array(sst,mask=flag2&amp;gt;0)&lt;br /&gt;nfile.close()&lt;br /&gt;&lt;br /&gt;# plot by PyNGL&lt;br /&gt;#  Open a workstation.&lt;br /&gt;#&lt;br /&gt;wks_type = "png"&lt;br /&gt;wks = Ngl.open_wks(wks_type,"MODIS")&lt;br /&gt;&lt;br /&gt;resources = Ngl.Resources()&lt;br /&gt;&lt;br /&gt;resources.tiXAxisString = "~F25~longitude"&lt;br /&gt;resources.tiYAxisString = "~F25~latitude"&lt;br /&gt;&lt;br /&gt;resources.cnFillOn              = True     # Turn on contour fill.&lt;br /&gt;resources.cnLineLabelsOn        = False    # Turn off line labels.&lt;br /&gt;resources.cnInfoLabelOn         = False    # Turn off info label.&lt;br /&gt;resources.mpGridAndLimbOn             = False&lt;br /&gt;&lt;br /&gt;resources.sfXCStartV = float(min(lon[xrange]))   # Define where contour plot&lt;br /&gt;resources.sfXCEndV   = float(max(lon[xrange]))   # should lie on the map plot.&lt;br /&gt;resources.sfYCStartV = float(min(lat[yrange]))&lt;br /&gt;resources.sfYCEndV   = float(max(lat[yrange]))&lt;br /&gt;&lt;br /&gt;resources.mpLimitMode = "LatLon"    # Limit the map view.&lt;br /&gt;resources.mpMinLonF   = float(min(lon[xrange]))&lt;br /&gt;resources.mpMaxLonF   = float(max(lon[xrange]))&lt;br /&gt;resources.mpMinLatF   = float(min(lat[yrange]))&lt;br /&gt;resources.mpMaxLatF   = float(max(lat[yrange]))&lt;br /&gt;resources.mpDataBaseVersion = "MediumRes"&lt;br /&gt;resources.tiMainString = "MODIS aqua Global Level 3 Mapped Mid-IR SST day=%(td)s"  %locals()# Set a title.&lt;br /&gt;resources.tiMainFontHeightF=0.015&lt;br /&gt;resources.cnLevelSelectionMode = "ExplicitLevels" # Define own levels.&lt;br /&gt;resources.cnLevels             = np.arange(20.,30.,0.5)&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;# draw contours over map.&lt;br /&gt;#&lt;br /&gt;map = Ngl.contour_map(wks,sst,resources)&lt;br /&gt;&lt;br /&gt;Ngl.end()&lt;br /&gt;&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_DVivl99_vFE/THyZfBpZWAI/AAAAAAAAAmY/AJxX4Gn1WDA/s1600/MODIS.000001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_DVivl99_vFE/THyZfBpZWAI/AAAAAAAAAmY/AJxX4Gn1WDA/s320/MODIS.000001.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;MODISにはAquaとTerra、それぞれに海面水温データとしてはMid-IR SSTとthermal IR SSTがある。どのように使いわけたらいいのだろうか？&lt;br /&gt;&lt;br /&gt;参照&lt;br /&gt;JAXA　MODISページ&lt;br /&gt;&lt;a href="http://www.eorc.jaxa.jp/hatoyama/satellite/sendata/modis_j.html"&gt;http://www.eorc.jaxa.jp/hatoyama/satellite/sendata/modis_j.html &lt;/a&gt;&lt;br /&gt;EORC&lt;br /&gt;&lt;a href="http://kuroshio.eorc.jaxa.jp/ADEOS/mod_nrt_new/index.html"&gt;http://kuroshio.eorc.jaxa.jp/ADEOS/mod_nrt_new/index.html&lt;/a&gt;&lt;br /&gt;MODIS wikipedia&lt;br /&gt;&lt;a href="http://ja.wikipedia.org/wiki/MODIS"&gt;http://ja.wikipedia.org/wiki/MODIS&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-5044073374506009831?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/5044073374506009831/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=5044073374506009831' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/5044073374506009831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/5044073374506009831'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/09/modis-aqua-global-level-3-mapped-mid-ir.html' title='MODIS aqua Global Level 3 Mapped Mid-IR SST (4km)'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_DVivl99_vFE/THyZfBpZWAI/AAAAAAAAAmY/AJxX4Gn1WDA/s72-c/MODIS.000001.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-2575505845406355569</id><published>2010-08-31T21:43:00.000+09:00</published><updated>2010-08-31T21:43:53.761+09:00</updated><title type='text'>Scipyで常微分方程式を解く (2) 最適化</title><content type='html'>&lt;br /&gt;&lt;br /&gt;前回の応用として、&lt;br /&gt;&lt;img align="middle" border="0" src="http://www.codecogs.com/gif.latex?%5Cfrac%7B%5Cpartial%20y%7D%7B%5Cpartial%20x%7D=ay%28x%29" /&gt;&lt;br /&gt;を解き、&lt;br /&gt;&lt;img align="middle" border="0" src="http://www.codecogs.com/gif.latex?x=0,y=1" /&gt;&lt;br /&gt;&lt;img align="middle" border="0" src="http://www.codecogs.com/gif.latex?x=3,y=4" /&gt;&lt;br /&gt;を満たすような&lt;img align="middle" border="0" src="http://www.codecogs.com/gif.latex?a" /&gt;を求める。&lt;br /&gt;真の解は &lt;br /&gt;&lt;img align="middle" border="0" src="http://www.codecogs.com/gif.latex?e%5E%7B3a%7D=4" /&gt;&lt;br /&gt;より&lt;br /&gt;&lt;img align="middle" border="0" src="http://www.codecogs.com/gif.latex?a=%28%28log4%29/3%29" /&gt;&lt;br /&gt;&lt;br /&gt;以下がスクリプト。&lt;br /&gt;&lt;br /&gt;[1] a が与えられた時に、(x,y)=(0,1)から常微分方程式を積分し、x=x1でのyの値を返す関数y_at_x(a,x1)を定義。&lt;br /&gt;[2] y_at_x(a=1,x1=3)を真の解&lt;img align="middle" border="0" src="http://www.codecogs.com/gif.latex?e%5E3" /&gt;と比較。&lt;br /&gt;[3] F(a,x1,y1)=y_at_x(a,x1)-y1 という関数を定義。　&lt;br /&gt;[4]　F(a,x1=3,y1=4)=0　を解いてaを求める。aは&lt;a href="http://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html#root-finding"&gt;scipyのbrentq関数&lt;/a&gt;を使って0から1の範囲で探す。最後に真の解を使って答え合わせ。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;import numpy as np&lt;br /&gt;from scipy import integrate&lt;br /&gt;from scipy import optimize &lt;br /&gt;&lt;br /&gt;#solve dy/dx=a y&lt;br /&gt;# x=0, y=1  &lt;br /&gt;# x=3, y=4&lt;br /&gt;# what is a?&lt;br /&gt;&lt;br /&gt;#define derivative&lt;br /&gt;def dy_dx(y,x,a):&lt;br /&gt;    return a*y&lt;br /&gt;&lt;br /&gt;#[1]&lt;br /&gt;def y_at_x(a,x1):&lt;br /&gt;    y1, infodict = integrate.odeint(dy_dx, 1., [0,x1],args=(a,),full_output=True)&lt;br /&gt;    #print infodict["message"]&lt;br /&gt;    return y1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# [2] test y_at_x(a,x1)&lt;br /&gt;y_test= y_at_x(a=1.,x1=3.)&lt;br /&gt;print "test y_at_ax(1,3)",y_test[1],np.exp(1.*3.)&lt;br /&gt;&lt;br /&gt;# [3] define y_at_x(a,x1)-y1&lt;br /&gt;def F(a,x1,y1):&lt;br /&gt;    return y_at_x(a,x1)[1][0]-y1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# [4] Solve  y_at_x(a,3)-4=0&lt;br /&gt;asolution=optimize.brentq(F,0.,1.,args=(3.,4.))&lt;br /&gt;print "solution of a=",asolution&lt;br /&gt;print "true solution", np.log(4)/3.&lt;br /&gt;print "test solution1",y_at_x(a=asolution,x1=3.)[1][0], np.exp(asolution*3.)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;出力は&lt;br /&gt;&lt;pre class="prettyprint"&gt;test y_at_ax(1,3) [ 20.08553873] 20.0855369232&lt;br /&gt;solution of a= 0.462098103279&lt;br /&gt;true solution 0.462098120373&lt;br /&gt;test solution1 4.0 3.99999979487&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-2575505845406355569?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://oceansciencehack.blogspot.com/2010/08/scipy.html' title='Scipyで常微分方程式を解く (2) 最適化'/><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/2575505845406355569/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=2575505845406355569' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/2575505845406355569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/2575505845406355569'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/08/scipy-2.html' title='Scipyで常微分方程式を解く (2) 最適化'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-7856060664082352113</id><published>2010-08-30T14:04:00.001+09:00</published><updated>2010-08-30T15:28:03.424+09:00</updated><title type='text'>Scipyで常微分方程式を解く</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.scipy.org/"&gt;Scipy&lt;/a&gt;の&lt;a href="http://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.odeint.html"&gt;odeint&lt;/a&gt;関数を使い、常微分方程式を解いてみる。&lt;br /&gt;&lt;br /&gt;簡単な例として、&lt;br /&gt;&lt;img align="middle" border="0" src="http://www.codecogs.com/gif.latex?%5Cfrac%7B%5Cpartial%20y%7D%7B%5Cpartial%20x%7D=y%28x%29" /&gt;&lt;br /&gt;を、初期値&lt;br /&gt;&lt;img align="middle" border="0" src="http://www.codecogs.com/gif.latex?x=0,%20y=1" /&gt;&lt;br /&gt;で解く。&lt;br /&gt;真の解は&lt;br /&gt;&lt;img align="middle" border="0" src="http://www.codecogs.com/gif.latex?y=e%5E%7Bx%7D" /&gt;&lt;br /&gt;である。&lt;br /&gt;&lt;br /&gt;以下がpythonスクリプト。xの0から3まで積分している。数値計算で得られた値を＋で、真の解より得られる値を実線で図示している。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;import numpy as np&lt;br /&gt;from scipy import integrate&lt;br /&gt;import matplotlib.pyplot as plt &lt;br /&gt;&lt;br /&gt;#solve dy/dx=y&lt;br /&gt;&lt;br /&gt;#define derivative&lt;br /&gt;def dy_dx(y,x):&lt;br /&gt;    return y&lt;br /&gt;&lt;br /&gt;#integration&lt;br /&gt;x1=np.linspace(0,3, 10)&lt;br /&gt;x=np.linspace(0,3, 100)&lt;br /&gt;y1, infodict = integrate.odeint(dy_dx, 1., x1, full_output=True)&lt;br /&gt;print infodict&lt;br /&gt;&lt;br /&gt;# plot&lt;br /&gt;plt.plot(x1,y1,'+',markersize=12)  #solusion &lt;br /&gt;plt.plot(x,np.exp(x))            #true solution &lt;br /&gt;plt.savefig("ode_ex.png")&lt;br /&gt;plt.show()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_DVivl99_vFE/THs5qJKKaHI/AAAAAAAAAmU/FqJdUCSI0ss/s1600/ode_ex.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="241" src="http://4.bp.blogspot.com/_DVivl99_vFE/THs5qJKKaHI/AAAAAAAAAmU/FqJdUCSI0ss/s320/ode_ex.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;参照:&lt;br /&gt;LoktaVolterraTutorial&lt;br /&gt;&lt;a href="http://www.scipy.org/LoktaVolterraTutorial"&gt;http://www.scipy.org/LoktaVolterraTutorial&amp;nbsp;&lt;/a&gt;&lt;br /&gt;A Coupled Spring-Mass System&lt;br /&gt;&lt;a href="http://www.scipy.org/Cookbook/CoupledSpringMassSystem"&gt;http://www.scipy.org/Cookbook/CoupledSpringMassSystem&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-7856060664082352113?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/7856060664082352113/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=7856060664082352113' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7856060664082352113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7856060664082352113'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/08/scipy.html' title='Scipyで常微分方程式を解く'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_DVivl99_vFE/THs5qJKKaHI/AAAAAAAAAmU/FqJdUCSI0ss/s72-c/ode_ex.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-177883646229066757</id><published>2010-08-30T00:07:00.001+09:00</published><updated>2010-08-30T12:42:05.864+09:00</updated><title type='text'>bloggerで数式を書くテスト</title><content type='html'>&lt;br /&gt;&lt;br /&gt;こちらの記事を参照した。&lt;br /&gt;&lt;a href="http://satomacoto.blogspot.com/2009/11/latex-for-bloggersafariblogger.html"&gt;LaTeX for BloggerをSafariと新しい編集インターフェイスのために改造する。&lt;/a&gt;&lt;br /&gt;&lt;a href="http://satomacoto.blogspot.com/2009/11/latex-for-bloggersafariblogger.html"&gt;http://satomacoto.blogspot.com/2009/11/latex-for-bloggersafariblogger.html&amp;nbsp;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;以下のような数式が書ける。 &lt;br /&gt;&lt;img align="middle" border="0" src="http://www.codecogs.com/gif.latex?%5Cfrac%7B%5Cpartial%20u%7D%7B%5Cpartial%20t%7D-f%5Cupsilon%20=-%5Cfrac%7B1%7D%7B%5Crho%20%7D%5Cfrac%7B%5Cpartial%20p%7D%7B%5Cpartial%20x%7D+F" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-177883646229066757?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/177883646229066757/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=177883646229066757' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/177883646229066757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/177883646229066757'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/08/blogger.html' title='bloggerで数式を書くテスト'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-2161582849586564940</id><published>2010-08-29T16:48:00.000+09:00</published><updated>2010-08-29T16:48:32.776+09:00</updated><title type='text'>PyNGLとPyNIOをインストール</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.pyngl.ucar.edu/index.shtml"&gt;PyNGL(1.31)とPyNIO(1.4.0)&lt;/a&gt;をUbuntu10.04にインストールした。&lt;br /&gt;&lt;br /&gt;PyNGLは &lt;a href="http://www.ncl.ucar.edu/"&gt;NCAR Command Language&lt;/a&gt; (NCL)をもとにしたpythonベースのグラフィックモジュールで、PyNIOはいろいろな形式のファイルを読み込むモジュールである。&lt;br /&gt;&lt;br /&gt;以下がインストール手順。&lt;br /&gt;&lt;br /&gt;(1)　プレコンパイル済みのファイルを入手&lt;br /&gt;PyNGL-1.3.1.linux-debian-i686-gcc432-py255-numpy130.tar.gz　と　PyNIO-1.4.0.linux-debian-i686-gcc432-py255-numpy130.tar.gz　を&lt;a href="http://www.earthsystemgrid.org/home.htm"&gt;Earth System Grid&lt;/a&gt;より入手。&lt;br /&gt;Pythonのバージョンは2.6.5を使っているが、numpyは1.3.0を使っているので、プレコンパイル済みのバイナリの中からこれらを選択した。&lt;br /&gt;&lt;br/&gt;(2)　以下を実行する。&lt;br /&gt;&lt;pre class="prettyprint"&gt;sudo tar -C /usr/local -xzf PyNIO-1.4.0.linux-debian-i686-gcc432-py255-numpy130.tar.gz&lt;br /&gt;sudo tar -C /usr/local -xzf PyNGL-1.3.1.linux-debian-i686-gcc432-py255-numpy130.tar.gz　&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(3)　パスを通す。&lt;br /&gt;&lt;pre class="prettyprint"&gt;export PYTHONPATH=$PYTHONPATH:/usr/local/lib/python2.5/site-packages:/usr/local/lib/python2.5/si&lt;br /&gt;te-packages/PyNIO:/usr/local/lib/python2.5/site-packages/PyNGL&lt;br /&gt;export PYNGL_NCARG=/usr/local/lib/python2.5/site-packages/PyNGL/ncarg&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(4) &lt;a href="http://www.pyngl.ucar.edu/pynglex.shtml"&gt;pynglex&lt;/a&gt;の書き換え&lt;br /&gt;/usr/local/bin/pynglexの一行目を&lt;br /&gt;&lt;pre class="prettyprint"&gt;#!/usr/bin/env python &lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;のように編集する。&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-2161582849586564940?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/2161582849586564940/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=2161582849586564940' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/2161582849586564940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/2161582849586564940'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/08/pynglpynio.html' title='PyNGLとPyNIOをインストール'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-7246681057395127267</id><published>2010-05-27T22:15:00.003+09:00</published><updated>2010-08-30T22:54:27.609+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data'/><title type='text'>東北大学　外洋域新世代海面水温</title><content type='html'>&lt;br /&gt;&lt;br /&gt;東北大学外洋域新世代海面水温（&lt;a href="http://www.ocean.caos.tohoku.ac.jp/%7Emerge/sstbinary/actvalbm.cgi"&gt;http://www.ocean.caos.tohoku.ac.jp/~merge/sstbinary/actvalbm.cgi&lt;/a&gt;)（分解能1/20度）を読むモジュールである。&lt;br /&gt;ファイル名としてはgzipされたファイルを指定でき、解凍する必要はない。&lt;br /&gt;(ftpのURLも直接指定できるがネットワークの負荷を考えること。）&lt;br /&gt;メインプログラムとして走らせた時は領域一部をmatplotlibでプロットする。&lt;br /&gt;&lt;br /&gt;readNGSST.py&lt;br /&gt;&lt;pre class="prettyprint"&gt;import numpy as np&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;&lt;br /&gt;def readNGSST(dir,file):&lt;br /&gt;    """&lt;br /&gt;   read Tohoku univ. New Generation Sea Surface Temp.&lt;br /&gt;&lt;br /&gt;   usage:&lt;br /&gt;      lon,lat,sst=readNGSST(dir,file)&lt;br /&gt;     &lt;br /&gt;   input&lt;br /&gt;      dir working dir&lt;br /&gt;      file filename &lt;br /&gt;           gzipped file is fine.&lt;br /&gt;           URL also works&lt;br /&gt;   output&lt;br /&gt;      lon longitude&lt;br /&gt;      lat latitude&lt;br /&gt;      SST sst data (masked array)          &lt;br /&gt;    """&lt;br /&gt;    # read data&lt;br /&gt;    ds=np.DataSource(dir)&lt;br /&gt;    f=ds.open(file, 'r')&lt;br /&gt;    f.seek(200) # skip header&lt;br /&gt;    sst=np.frombuffer(f.read(),dtype="u1")&lt;br /&gt;    f.close()&lt;br /&gt;&lt;br /&gt;    # as masked array&lt;br /&gt;    sst=np.ma.masked_array(sst,mask=np.logical_or(sst==255, sst==0))&lt;br /&gt;    sst=sst.reshape(1000,1000)*0.15-3.&lt;br /&gt;&lt;br /&gt;    # grid&lt;br /&gt;    lon=116.+np.arange(1000)*0.05&lt;br /&gt;    lat=13.+np.arange(1000)*0.05&lt;br /&gt;&lt;br /&gt;    return lon,lat, sst&lt;br /&gt;&lt;br /&gt;############################################&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;&lt;br /&gt;    # example plot&lt;br /&gt;&lt;br /&gt;    #read data&lt;br /&gt;    filename="msst2009010112.raw.gz"&lt;br /&gt;    lon,lat,sst=readNGSST(dir=".",file=filename)&lt;br /&gt;&lt;br /&gt;    #grid salection&lt;br /&gt;    xrange=np.logical_and(lon&amp;gt;=130,lon&amp;lt;=145.)&lt;br /&gt;    yrange=np.logical_and(lat&amp;gt;=30,lat&amp;lt;=45.)&lt;br /&gt;    # plot&lt;br /&gt;    plt.figure()&lt;br /&gt;    plt.pcolor(lon[xrange],lat[yrange],(sst[yrange,:])[:,xrange]) &lt;br /&gt;    plt.savefig("ngsst.png")&lt;br /&gt;    plt.show()&amp;nbsp;&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_DVivl99_vFE/S_4v41Gov5I/AAAAAAAAAmE/bTg6fTidpgg/s1600/ngsst.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_DVivl99_vFE/S_4v41Gov5I/AAAAAAAAAmE/bTg6fTidpgg/s320/ngsst.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;参考&lt;br /&gt;書籍&lt;br /&gt;&lt;a href="http://www.amazon.co.jp/gp/product/1847197906?ie=UTF8&amp;amp;tag=climatechange-22&amp;amp;linkCode=as2&amp;amp;camp=247&amp;amp;creative=7399&amp;amp;creativeASIN=1847197906"&gt;Matplotlib for Python Developers: Build Remarkable Publication Quality Plots the Easy Way&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.jp/e/ir?t=climatechange-22&amp;amp;l=as2&amp;amp;o=9&amp;amp;a=1847197906" style="border: medium none ! important; margin: 0px ! important;" width="1" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-7246681057395127267?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/7246681057395127267/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=7246681057395127267' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7246681057395127267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7246681057395127267'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/05/blog-post.html' title='東北大学　外洋域新世代海面水温'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_DVivl99_vFE/S_4v41Gov5I/AAAAAAAAAmE/bTg6fTidpgg/s72-c/ngsst.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-90325625378209334</id><published>2010-05-26T23:38:00.000+09:00</published><updated>2010-05-26T23:38:37.348+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Rでwavelet</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/05/r.html"&gt;前回&lt;/a&gt;までのようにRにNINO3のデータを渡し、今回は連続wavelet解析を行ってみる。&lt;br /&gt;&lt;br /&gt;Wavelet解析には&lt;a href="http://cran.r-project.org/web/packages/wmtsa/index.html"&gt;wmtsaパッケージ&lt;/a&gt;を用いる。&lt;br /&gt;&lt;br /&gt;以下がプログラムである。&lt;br /&gt;プロットする時、series=TRUEでもとの時系列もプロットする。 &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;from read_NINO import read_NINO&lt;br /&gt;&lt;br /&gt;#for R&lt;br /&gt;import rpy2.robjects as robjects&lt;br /&gt;&lt;br /&gt;data=read_NINO()&lt;br /&gt;x=data["NINO3 ANOM"]&lt;br /&gt;&lt;br /&gt;year=str(x.year[0])&lt;br /&gt;month=str(x.month[0])&lt;br /&gt;&lt;br /&gt;#data to R&lt;br /&gt;nino3=robjects.FloatVector(x)&lt;br /&gt;robjects.globalEnv["nino3"] = nino3&lt;br /&gt;&lt;br /&gt;#r script&lt;br /&gt;r=robjects.r&lt;br /&gt;rscripts="""&lt;br /&gt;nino3ts=ts(nino3,start=c(%(year)s,%(month)s),frequency=12)&lt;br /&gt;png('NINO3_R_wavelet.png')&lt;br /&gt;&lt;br /&gt;#import library wmtsa&lt;br /&gt;library("wmtsa")&lt;br /&gt;## calculate the CWT of the sunspots series using&lt;br /&gt;## a Mexican hat wavelet (gaussian2)&lt;br /&gt;a&amp;lt;-wavCWT(nino3ts)    &lt;br /&gt;## print the result&lt;br /&gt;print(a)&lt;br /&gt;## plot an image of the modulus of the CWT and the&lt;br /&gt;## time series&lt;br /&gt;plot(a,series=TRUE) &lt;br /&gt;&lt;br /&gt;dev.off()&lt;br /&gt;"""&lt;br /&gt;r(rscripts %locals())&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;結果&lt;br /&gt;&lt;blockquote style="background-color: #eeeeee;"&gt;Continuous Wavelet Transform of nino3ts&lt;br /&gt;---------------------------------------&lt;br /&gt;Wavelet&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : Mexican Hat (Gaussian, second derivative) &lt;br /&gt;Wavelet variance&amp;nbsp; : 1 &lt;br /&gt;Length of series&amp;nbsp; : 724 &lt;br /&gt;Sampling interval : 0.08333333 &lt;br /&gt;Number of scales&amp;nbsp; : 73 &lt;br /&gt;Range of scales&amp;nbsp;&amp;nbsp; : 0.0833333333333333 to 60.3333333333333 &lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_DVivl99_vFE/S_zAqcfNuuI/AAAAAAAAAmA/F1EA7QKu3Gg/s1600/NINO3_R_wavelet.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/_DVivl99_vFE/S_zAqcfNuuI/AAAAAAAAAmA/F1EA7QKu3Gg/s320/NINO3_R_wavelet.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;x軸は年。Y軸は0が1年（2^0)、２が4年(2^2)に対応する。&lt;br /&gt;&lt;br /&gt;参考&lt;br /&gt;A Practical Guide to Wavelet Analysis&lt;br /&gt;&lt;a href="http://paos.colorado.edu/research/wavelets/" rel="nofollow"&gt;http://paos.colorado.edu/research/wavelets/&lt;/a&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;書籍&lt;br /&gt;&lt;a href="http://www.amazon.co.jp/gp/product/0521685087?ie=UTF8&amp;amp;tag=climatechange-22&amp;amp;linkCode=as2&amp;amp;camp=247&amp;amp;creative=7399&amp;amp;creativeASIN=0521685087"&gt;Wavelet Methods for Time Series Analysis (Cambridge Series in Statistical and Probabilistic Mathematics)&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.jp/e/ir?t=climatechange-22&amp;amp;l=as2&amp;amp;o=9&amp;amp;a=0521685087" style="border: medium none ! important; margin: 0px ! important;" width="1" /&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-90325625378209334?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/90325625378209334/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=90325625378209334' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/90325625378209334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/90325625378209334'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/05/rwavelet.html' title='Rでwavelet'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_DVivl99_vFE/S_zAqcfNuuI/AAAAAAAAAmA/F1EA7QKu3Gg/s72-c/NINO3_R_wavelet.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-2294378426976050115</id><published>2010-05-15T15:17:00.001+09:00</published><updated>2010-05-15T21:26:57.057+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Rで自己相関</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/05/r.html"&gt;前回&lt;/a&gt;に続いてRにNINO3のデータを渡し、今回は自己相関を求めてみる。&lt;br /&gt;&lt;br /&gt;Rで自己相関を求める関数は&lt;a href="http://stat.ethz.ch/R-manual/R-patched/library/stats/html/acf.html"&gt;acf &lt;/a&gt;である。&lt;br /&gt;自己相関を求めるlagは７２点（７２ヶ月）までとした（lag.max=72)&lt;br /&gt;自己相関の他に&lt;br /&gt;自己共分散　type="covariance"&lt;br /&gt;偏自己相関　type="partial"&lt;br /&gt;も求めることができる。&lt;br /&gt;以下、プログラム &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;#coding: utf-8&lt;br /&gt;from read_NINO import read_NINO&lt;br /&gt;&lt;br /&gt;#for R&lt;br /&gt;import rpy2.robjects as robjects&lt;br /&gt;&lt;br /&gt;data=read_NINO()&lt;br /&gt;x=data["NINO3 ANOM"]&lt;br /&gt;&lt;br /&gt;year=str(x.year[0])&lt;br /&gt;month=str(x.month[0])&lt;br /&gt;&lt;br /&gt;#data to R&lt;br /&gt;nino3=robjects.FloatVector(x)&lt;br /&gt;robjects.globalEnv["nino3"] = nino3&lt;br /&gt;&lt;br /&gt;#r script&lt;br /&gt;r=robjects.r&lt;br /&gt;rscripts="""&lt;br /&gt;nino3ts=ts(nino3,start=c(%(year)s,%(month)s),frequency=12)&lt;br /&gt;png('NINO3_R_acf.png')&lt;br /&gt;&lt;br /&gt;op&amp;lt;- par(mfrow=c(1,3)) #  描画設定：1行3列画面表示&lt;br /&gt;acf(nino3ts,lag.max=72,xlab="lag (year)")              # 自己相関プロット&lt;br /&gt;acf(nino3ts,type="covariance",lag.max=72,xlab="lag (year)") #自己共分散プロット&lt;br /&gt;acf(nino3ts,type="partial",lag.max=72,xlab="lag (year)")    #偏相関プロット&lt;br /&gt;par(op)                  #作業前の描画設定に戻す&lt;br /&gt;&lt;br /&gt;dev.off()&lt;br /&gt;"""&lt;br /&gt;r(rscripts %locals())&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_DVivl99_vFE/S-48QeMntyI/AAAAAAAAAl8/sdCvlqzLxGM/s1600/NINO3_R_acf.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_DVivl99_vFE/S-48QeMntyI/AAAAAAAAAl8/sdCvlqzLxGM/s320/NINO3_R_acf.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;図の横の点線は95%の信頼区間をしめす（これより絶対値の小さい相関は95%の信頼区間で無相関ではないとは言えない）。　これを90%などにしたいときはci=0.9などとする。&lt;br /&gt;&lt;br /&gt;参考&lt;br /&gt;&lt;a href="http://www.okada.jp.org/RWiki/index.php?R%A4%CE%B4%F0%CB%DC%A5%D1%A5%C3%A5%B1%A1%BC%A5%B8%C3%E6%A4%CE%BB%FE%B7%CF%CE%F3%A5%AA%A5%D6%A5%B8%A5%A7%A5%AF%A5%C8%B0%EC%CD%F7"&gt;R の基本パッケージ base, stats 中の時系列オブジェクトの簡易解説&lt;/a&gt;&lt;br /&gt;(RjpWiki)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://d.hatena.ne.jp/hamadakoichi/20100510/p1"&gt;&amp;nbsp;R言語による時系列分析&lt;/a&gt;&lt;br /&gt;(hamadakoichi blog)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.co.jp/gp/product/4916092910?ie=UTF8&amp;amp;tag=climatechange-22&amp;amp;linkCode=as2&amp;amp;camp=247&amp;amp;creative=7399&amp;amp;creativeASIN=4916092910"&gt;Rによる時系列分析入門&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.jp/e/ir?t=climatechange-22&amp;amp;l=as2&amp;amp;o=9&amp;amp;a=4916092910" style="border: medium none ! important; margin: 0px ! important;" width="1" /&gt;&lt;br /&gt;（書籍） &lt;br /&gt;&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/search/label/R"&gt;過去のRに関する記事&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-2294378426976050115?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/2294378426976050115/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=2294378426976050115' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/2294378426976050115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/2294378426976050115'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/05/r_15.html' title='Rで自己相関'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_DVivl99_vFE/S-48QeMntyI/AAAAAAAAAl8/sdCvlqzLxGM/s72-c/NINO3_R_acf.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-7281503393351888950</id><published>2010-05-14T18:23:00.000+09:00</published><updated>2010-05-14T18:23:18.599+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Rで時系列</title><content type='html'>&lt;br /&gt;&lt;br /&gt;以前につくった&lt;a href="http://oceansciencehack.blogspot.com/2010/03/nino.html"&gt;pythonで取り込むNINO監視領域のデータ&lt;/a&gt;を、統計ソフトRに持って行き、時系列データとする。Rに取り込むとRを使って統計解析ができるから便利だ。&lt;br /&gt;&lt;br /&gt;Pythonの世界からRの世界に持っていくには&lt;a href="http://rpy.sourceforge.net/rpy2.html"&gt;rpy2&lt;/a&gt;を用いる。&lt;br /&gt;NINO3データを渡して、Rではtsを使って時系列オブジェクトを作り、&lt;br /&gt;plot.tsでプロットする。&lt;br /&gt;&lt;br /&gt;以下、プログラム。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;pre class="prettyprint"&gt;from read_NINO import read_NINO&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#for R&lt;br /&gt;import rpy2.robjects as robjects&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;data=read_NINO()&lt;br /&gt;x=data["NINO3 ANOM"]&lt;br /&gt;&lt;br /&gt;year=str(x.year[0])&lt;br /&gt;month=str(x.month[0])&lt;br /&gt;&lt;br /&gt;#data to R&lt;br /&gt;nino3=robjects.FloatVector(x)&lt;br /&gt;robjects.globalEnv["nino3"] = nino3&lt;br /&gt;&lt;br /&gt;#r script&lt;br /&gt;r=robjects.r&lt;br /&gt;rscripts="""&lt;br /&gt;png('NINO3_R.png')&lt;br /&gt;nino3ts=ts(nino3,start=c(%(year)s,%(month)s),frequency=12)&lt;br /&gt;plot.ts(nino3ts)&lt;br /&gt;dev.off()&lt;br /&gt;"""&lt;br /&gt;r(rscripts %locals())&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_DVivl99_vFE/S-zzPVeUiOI/AAAAAAAAAl0/frMd1ITRIqM/s1600/NINO3_R.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_DVivl99_vFE/S-zzPVeUiOI/AAAAAAAAAl0/frMd1ITRIqM/s320/NINO3_R.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;参考&lt;br /&gt;&lt;a href="http://www.okada.jp.org/RWiki/index.php?R%A4%CE%B4%F0%CB%DC%A5%D1%A5%C3%A5%B1%A1%BC%A5%B8%C3%E6%A4%CE%BB%FE%B7%CF%CE%F3%A5%AA%A5%D6%A5%B8%A5%A7%A5%AF%A5%C8%B0%EC%CD%F7"&gt;R の基本パッケージ base, stats 中の時系列オブジェクトの簡易解説&lt;/a&gt;&lt;br /&gt;(RjpWiki)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://d.hatena.ne.jp/hamadakoichi/20100510/p1"&gt;&amp;nbsp;R言語による時系列分析&lt;/a&gt;&lt;br /&gt;(hamadakoichi blog)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.co.jp/gp/product/4916092910?ie=UTF8&amp;amp;tag=climatechange-22&amp;amp;linkCode=as2&amp;amp;camp=247&amp;amp;creative=7399&amp;amp;creativeASIN=4916092910"&gt;Rによる時系列分析入門&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.jp/e/ir?t=climatechange-22&amp;amp;l=as2&amp;amp;o=9&amp;amp;a=4916092910" style="border: medium none ! important; margin: 0px ! important;" width="1" /&gt;&lt;br /&gt;（書籍） &lt;br /&gt;&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/search/label/R"&gt;過去のRに関する記事&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-7281503393351888950?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/7281503393351888950/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=7281503393351888950' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7281503393351888950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7281503393351888950'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/05/r.html' title='Rで時系列'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_DVivl99_vFE/S-zzPVeUiOI/AAAAAAAAAl0/frMd1ITRIqM/s72-c/NINO3_R.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-5591827075428303349</id><published>2010-04-30T21:32:00.000+09:00</published><updated>2010-04-30T21:32:14.883+09:00</updated><title type='text'>k-平均法</title><content type='html'>&lt;br /&gt;&lt;br /&gt;k-平均法は非階層型クラスタリング手法の一つである。&lt;br /&gt;&lt;br /&gt;参考&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://d.hatena.ne.jp/nitoyon/20090409/kmeans_visualise" name="kmeans_visualise"&gt;クラスタリングの定番アルゴリズム「K-means法」をビジュアライズしてみた（てっく煮ブログ）&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;以前つくった串本浦神の潮位差と黒潮緯度の分布（下図）を２つのグループに分けてみる。&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_DVivl99_vFE/S9qN9aJSScI/AAAAAAAAAlk/uR-fRevuh6g/s1600/kurosho_corr.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_DVivl99_vFE/S9qN9aJSScI/AAAAAAAAAlk/uR-fRevuh6g/s320/kurosho_corr.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span class="hatena-star-comment-container"&gt;&lt;img alt="Comments" class="hatena-star-comment-button" src="http://s.hatena.ne.jp/images/comment.gif" style="border: medium none; cursor: pointer; display: none; margin: 0pt; padding: 0pt; vertical-align: middle;" tabindex="0" title="Comments" /&gt;&lt;/span&gt;&lt;span class="hatena-star-star-container"&gt;道具は&lt;a href="http://docs.scipy.org/doc/scipy-0.7.x/reference/cluster.vq.html"&gt;scipyのk-means2関数&lt;/a&gt;を用いる。分けられたグループで色分けする。大きな●はそれぞれのグループの重心である(kmeans2で出てくる重心はNormarizeされたデータのものなのでそのままはつかわないこと）。重心が収束しているかの確認もおこなっている。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span class="hatena-star-star-container"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;#read module&lt;br /&gt;from read_kuroshio_lat import read_kuroshio_lat&lt;br /&gt;from read_kushimoto_uragami import read_kushimoto_uragami&lt;br /&gt;&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;import numpy as np&lt;br /&gt;&lt;br /&gt;from scipy.cluster.vq import  kmeans2, whiten,vq # functions for k-means&lt;br /&gt;&lt;br /&gt;#read data&lt;br /&gt;kuroshio_lat=read_kuroshio_lat()&lt;br /&gt;kushimoto_uragami=read_kushimoto_uragami()   &lt;br /&gt;&lt;br /&gt;#kmeans&lt;br /&gt;nomissing=np.logical_and(~kuroshio_lat.mask,~kushimoto_uragami.mask) #missing value should &lt;br /&gt;be excluded.&lt;br /&gt;lat=kuroshio_lat.data[nomissing]&lt;br /&gt;level=kushimoto_uragami.data[nomissing]&lt;br /&gt;data=np.column_stack((level,lat))&lt;br /&gt;&lt;br /&gt;whiteneddata=whiten(data) #whitened beforehand&lt;br /&gt;centroids,index=kmeans2(whiteneddata,2,iter=20) #k-means&lt;br /&gt;&lt;br /&gt;#check centroids are converged&lt;br /&gt;label = vq(whiteneddata, centroids)[0]&lt;br /&gt;for i in range(2):&lt;br /&gt;    print 'group=',i&lt;br /&gt;    print 'estimated=', centroids[i,:]&lt;br /&gt;    print 'actual   =',whiteneddata[label==i,:].mean(axis=0)&lt;br /&gt;&lt;br /&gt;#### plot&lt;br /&gt;plt.figure()&lt;br /&gt;#1stgroup &lt;br /&gt;plt.plot(level[index==0],lat[index==0],'r.')&lt;br /&gt;plt.plot(level[index==1].mean(),lat[index==1].mean(),'go',markersize=12)&lt;br /&gt;#2nd group&lt;br /&gt;plt.plot(level[index==1],lat[index==1],'g.')&lt;br /&gt;plt.plot(level[index==0].mean(),lat[index==0].mean(),'ro',markersize=12)&lt;br /&gt;&lt;br /&gt;plt.xlabel("Kushimoto-Uragami")&lt;br /&gt;plt.ylabel("Kuroshio Latitude")&lt;br /&gt;plt.savefig("kurosho_kmeans.png")&lt;br /&gt;plt.show()&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;出力&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;group= 0&lt;br /&gt;estimated= [  1.58989573  42.05977249]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;actual   = [  1.58989573  42.05977249]&lt;br /&gt;group= 1&lt;br /&gt;estimated= [  0.14166519  40.3829155 ]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; actual   = [  0.14166519  40.3829155 ]&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_DVivl99_vFE/S9qQNrOvP2I/AAAAAAAAAls/8Q4MjiHLITg/s1600/kurosho_kmeans.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_DVivl99_vFE/S9qQNrOvP2I/AAAAAAAAAls/8Q4MjiHLITg/s320/kurosho_kmeans.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-5591827075428303349?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/5591827075428303349/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=5591827075428303349' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/5591827075428303349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/5591827075428303349'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/04/k.html' title='k-平均法'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_DVivl99_vFE/S9qN9aJSScI/AAAAAAAAAlk/uR-fRevuh6g/s72-c/kurosho_corr.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-6583495302916422608</id><published>2010-04-27T23:28:00.001+09:00</published><updated>2010-04-27T23:29:07.186+09:00</updated><title type='text'>NINO3のスペクトル密度を信頼区間つきで</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/04/psd.html"&gt;前回つくった信頼区間つきでスペクトル密度をもとめる関数&lt;/a&gt;を、NINO3監視指数に適用する。NINO3の読み込みは&lt;a href="http://oceansciencehack.blogspot.com/2010/03/nino.html"&gt;以前に作ったread_NINOモジュール&lt;/a&gt;を用いる。&lt;br /&gt;&lt;br /&gt;下の例ではtaperにはHammingフィルタ、周波数空間でのスムージングに1-2-1フィルタ、信頼度は90%を用いた。&lt;br /&gt;黒線がスペクトル密度、赤点線が信頼区間を示す。縦の黒点線は2年と7年に対応する補助線である。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;from read_NINO import read_NINO&lt;br /&gt;&lt;br /&gt;import matplotlib.mlab as mlab&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;import numpy as np&lt;br /&gt;&lt;br /&gt;from  psd_withError import psd_withError #import psd_withError module  &lt;br /&gt;&lt;br /&gt;data=read_NINO()&lt;br /&gt;x=data["NINO3 ANOM"]&lt;br /&gt;&lt;br /&gt;# case1&lt;br /&gt;Pxx,f,upper,lower=psd_withError(x, NFFT=len(x),Fs=12,window=np.hamming(len(x)),smooth＝[1,2,1],Confidencelevel=0.90)  &lt;br /&gt;plt.figure()&lt;br /&gt;plt.loglog(f,Pxx,'k-o')&lt;br /&gt;plt.loglog(f,upper,'r--')&lt;br /&gt;plt.loglog(f,lower,'r--')&lt;br /&gt;plt.loglog([1./2.,1./2.],[1.E-5,1.E2],'k--') #vertical line for 2 years&lt;br /&gt;plt.loglog([1./7.,1./7.],[1.E-5,1.E2],'k--') #vertical line for 7 years&lt;br /&gt;plt.savefig("NINO_psd_withError.png")&lt;br /&gt;plt.show()&amp;nbsp;&lt;/pre&gt;&lt;pre class="prettyprint"&gt;&amp;nbsp;&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_DVivl99_vFE/S9b0GmZggMI/AAAAAAAAAlc/DNA9ypWnjMI/s1600/NINO_psd_withError.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_DVivl99_vFE/S9b0GmZggMI/AAAAAAAAAlc/DNA9ypWnjMI/s320/NINO_psd_withError.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;pre class="prettyprint"&gt;&amp;nbsp;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-6583495302916422608?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/6583495302916422608/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=6583495302916422608' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/6583495302916422608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/6583495302916422608'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/04/nino3.html' title='NINO3のスペクトル密度を信頼区間つきで'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_DVivl99_vFE/S9b0GmZggMI/AAAAAAAAAlc/DNA9ypWnjMI/s72-c/NINO_psd_withError.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-7886374519411173990</id><published>2010-04-26T23:20:00.002+09:00</published><updated>2010-04-26T23:22:24.252+09:00</updated><title type='text'>psd関数をスペルトル密度誤差も出せるよう拡張</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/04/blog-post.html"&gt;前回&lt;/a&gt;の見延さんのスペクトル密度の推定誤差理論を使って、&lt;a href="http://oceansciencehack.blogspot.com/2010/03/ensopsdtaper.html"&gt;以前用いたmatlabplotlib.mlab.psd&lt;/a&gt;関数を拡張したモジュールを作った(psd_withError)。&lt;br /&gt;&lt;br /&gt;stand aloneで用いる時(&lt;span class="kwd"&gt;if&lt;/span&gt;&lt;span class="pln"&gt; __name__ &lt;/span&gt;&lt;span class="pun"&gt;==&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'__main__'&lt;/span&gt;&lt;span class="pun"&gt;:以下)は、見延さんのスクリプトと同じことを確認するプログラム。結果が同じにならないのは、&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="pun"&gt;見延さんのスクリプトではfftの後データ数で割ってから二乗をとっている&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="pun"&gt;matplotlibのpsd関数でonesidedを取るとき2倍している&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="pun"&gt;matplotlibのpsd関数では、データテーパーをかけることによる振幅の減少を補償している&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="pun"&gt;ためである。もし同じ結果を得たければ、プログラム中のコメントアウトしている部分をはずすことで可能である。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="pun"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="pun"&gt; &lt;/span&gt;&lt;span class="pln"&gt;&lt;/span&gt;&lt;br /&gt;&lt;b style="color: red;"&gt;psd_withError.py&lt;/b&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;import numpy as np&lt;br /&gt;from numpy.random import randn&lt;br /&gt;import scipy as sp&lt;br /&gt;import scipy.signal as signal&lt;br /&gt;import scipy.stats as stats&lt;br /&gt;&lt;br /&gt;import matplotlib.pyplot as plt &lt;br /&gt;import matplotlib.mlab as mlab&lt;br /&gt;import matplotlib.cbook as cbook&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------&lt;br /&gt;def psd_withError(x, NFFT=256, Fs=2, detrend=mlab.detrend_none, window=mlab.window_hanning,noverlap=0, pad_to=None, sides='def&lt;br /&gt;ault', scale_by_freq=None,smooth=None,Confidencelevel=0.9):&lt;br /&gt;    """&lt;br /&gt;Extention of matplotlib.mlab.psd&lt;br /&gt;The power spectral density with upper and lower limits within confidence level&lt;br /&gt;You should not use Weltch's method here, instead you can use smoother in frequency domain with *smooth* &lt;br /&gt;&lt;br /&gt;Same input as matplotlib.mlab.psd except the following new inputs&lt;br /&gt;*smooth*:&lt;br /&gt;    smoothing window in frequency domain  &lt;br /&gt;    for example, 1-2-1 filter is [1,2,1]&lt;br /&gt;    default is None&lt;br /&gt;*Confidencelevel*&lt;br /&gt;    Confidence level to estimate upper and lower estimates.&lt;br /&gt;    Default is 0.9&lt;br /&gt;&lt;br /&gt;Returns the tuple (*Pxx*, *freqs*,*upper*,*lower*).&lt;br /&gt;    upper and lower are limits of psd within confidence level.   &lt;br /&gt;"""&lt;br /&gt;&lt;br /&gt;    Pxxtemp,freqs = mlab.psd( x, NFFT, Fs, detrend, window, noverlap, pad_to, sides,scale_by_freq)&lt;br /&gt;&lt;br /&gt;# commented out, if you want to get Minobe-san's result  Pxxtemp=Pxxtemp/float(NFFT)/2.*((np.abs(window)**2).mean())&lt;br /&gt;&lt;br /&gt;#smoothing&lt;br /&gt;    smooth=np.asarray(smooth)&lt;br /&gt;    if smooth is not None:&lt;br /&gt;        avfnc=smooth/float(sum(smooth))&lt;br /&gt;        Pxx=np.convolve(Pxxtemp[:,0],avfnc,mode="same")&lt;br /&gt;    else:&lt;br /&gt;        Pxx=Pxxtemp[:,0]&lt;br /&gt;        avfnc=np.asarray([1.])&lt;br /&gt;&lt;br /&gt;#estimate uppper and lower estimate woth equivalent degree of freedom&lt;br /&gt;    if pad_to is None:&lt;br /&gt;        pad_to = NFFT&lt;br /&gt;&lt;br /&gt;    if cbook.iterable(window):&lt;br /&gt;        assert(len(window) == NFFT)&lt;br /&gt;        windowVals = window&lt;br /&gt;    else:&lt;br /&gt;        windowVals = window(np.ones((NFFT,), x.dtype))&lt;br /&gt;&lt;br /&gt;    edof=(1.+(1./sum(avfnc**2)-1.)*float(NFFT)/float(pad_to)*np.mean(windowVals))# equivalent degree of freedom&lt;br /&gt;    a1=(1.-Confidencelevel)/2.&lt;br /&gt;    a2=1.-a1&lt;br /&gt;    lower=Pxx*stats.chi2.ppf(a1,2*edof)/stats.chi2.ppf(0.50,2*edof)&lt;br /&gt;    upper=Pxx*stats.chi2.ppf(a2,2*edof)/stats.chi2.ppf(0.50,2*edof)&lt;br /&gt;    return Pxx,freqs,upper,lower&lt;br /&gt;&lt;br /&gt;########################################################&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;    plt.figure()&lt;br /&gt;    for npnl in range(4):&lt;br /&gt;        tlng=100; nsmpl=1000&lt;br /&gt;        if npnl==0 :&lt;br /&gt;            nfft=100&lt;br /&gt;            taper=signal.boxcar(tlng)&lt;br /&gt;            avfnc=[1, 1, 1, 1, 1];&lt;br /&gt;            cttl='no padding, boxcar, 5-running'&lt;br /&gt;        elif npnl==1:&lt;br /&gt;            nfft=100&lt;br /&gt;            taper=signal.hamming(tlng)&lt;br /&gt;            avfnc=[1, 1, 1, 1, 1]&lt;br /&gt;            cttl='no padding, hamming, 5-running'&lt;br /&gt;        elif npnl==2:&lt;br /&gt;            nfft=200&lt;br /&gt;            taper=signal.boxcar(tlng)&lt;br /&gt;            avfnc=[1, 1, 1, 1, 1];&lt;br /&gt;            cttl='double padding, boxcar, 5-running'&lt;br /&gt;        elif npnl==3:&lt;br /&gt;            nfft=200&lt;br /&gt;            taper=signal.hamming(tlng)&lt;br /&gt;            avfnc=np.convolve([1, 2, 1],[1, 2, 1])&lt;br /&gt;            cttl='double padding, hamming, double 1-2-1'&lt;br /&gt;    &lt;br /&gt;        tsrs=randn(tlng,nsmpl)&lt;br /&gt;        ds_psd=np.zeros([nfft/2+1,nsmpl])&lt;br /&gt;        upper_psd=np.zeros([nfft/2+1,nsmpl])&lt;br /&gt;        lower_psd=np.zeros([nfft/2+1,nsmpl])&lt;br /&gt;        for n in range(nsmpl):&lt;br /&gt;            a,b,u,l=psd_withError(tsrs[:,n],NFFT=tlng,pad_to=nfft,Fs=1,window=taper,smooth=avfnc,Confidencelevel=0.9)&lt;br /&gt;            ds_psd[:,n]=a[:]&lt;br /&gt;            upper_psd[:,n]=u[:]&lt;br /&gt;            lower_psd[:,n]=l[:]&lt;br /&gt;        frq=b[:]&lt;br /&gt;&lt;br /&gt;# 90% confidence level by Monte-Carlo&lt;br /&gt;        srt_psd=np.sort(ds_psd,axis=1)&lt;br /&gt;        c=np.zeros([frq.size,2])                &lt;br /&gt;        c[:,0]=np.log10(srt_psd[:,nsmpl*0.05])&lt;br /&gt;        c[:,1]=np.log10(srt_psd[:,nsmpl*0.95])&lt;br /&gt;&lt;br /&gt;# estimate from extended degree of freedom &lt;br /&gt;        ce=np.zeros([frq.size,2]) &lt;br /&gt;        ce[:,0]=np.log10(np.sort(upper_psd,axis=1)[:,nsmpl*0.5])&lt;br /&gt;        ce[:,1]=np.log10(np.sort(lower_psd,axis=1)[:,nsmpl*0.5])&lt;br /&gt;#plot&lt;br /&gt;        plt.subplot(2,2,npnl+1)&lt;br /&gt;        plt.plot(frq,c,'b',frq,ce,'r')&lt;br /&gt;        plt.title(cttl)&lt;br /&gt;        plt.xlabel('frq')&lt;br /&gt;        plt.ylabel('psd')&lt;br /&gt;        if (npnl==0): plt.legend(('Monte-carlo','','Theory'),'lower center',labelspacing=0.05)&lt;br /&gt;    plt.subplots_adjust(wspace=0.6,hspace=0.4)&lt;br /&gt;    plt.savefig("psd_withError.png")&lt;br /&gt;    plt.show()&lt;br /&gt;&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_DVivl99_vFE/S9VUMfgV06I/AAAAAAAAAlU/3-k9Lmz6Zgs/s1600/psd_withError.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_DVivl99_vFE/S9VUMfgV06I/AAAAAAAAAlU/3-k9Lmz6Zgs/s320/psd_withError.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-7886374519411173990?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/7886374519411173990/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=7886374519411173990' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7886374519411173990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7886374519411173990'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/04/psd.html' title='psd関数をスペルトル密度誤差も出せるよう拡張'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_DVivl99_vFE/S9VUMfgV06I/AAAAAAAAAlU/3-k9Lmz6Zgs/s72-c/psd_withError.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-7208230370914908359</id><published>2010-04-20T23:55:00.000+09:00</published><updated>2010-04-20T23:55:57.015+09:00</updated><title type='text'>スペクトルの推定誤差</title><content type='html'>&lt;br /&gt;&lt;br /&gt;見延さんのスペクトル誤差に関するmatlab scriptをpythonに移植してみた。&lt;br /&gt;&lt;blockquote&gt;見延　2001:&lt;a href="http://ocw.hokudai.ac.jp/Course/GraduateSchool/Science/MeteorologyAndOceanology/2001/index.php?lang=ja&amp;amp;page=materials"&gt;大気海洋物理学特論&lt;/a&gt;4 大気海洋統計データ解析　第3章&lt;br /&gt;&lt;a href="http://ocw.hokudai.ac.jp/Course/GraduateSchool/Science/MeteorologyAndOceanology/2001/page/materials/MeterologyAndOceanology-2001-Note-03.pdf"&gt;http://ocw.hokudai.ac.jp/Course/GraduateSchool/Science/MeteorologyAndOceanology/2001/page/materials/MeterologyAndOceanology-2001-Note-03.pdf&lt;/a&gt;&lt;br /&gt;Page15-16 &lt;/blockquote&gt;numpy/scipy/matplotlibを使えば、matlabのscriptを移植するのはそれほど難しくない。&lt;br /&gt;χ二乗分布の累積分布の逆関数はscipyの&lt;a href="http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chi2.html#scipy.stats.chi2"&gt;stats.chi2.ppf&lt;/a&gt;をそのまま用いた。&lt;br /&gt;（注：今の場合関係ないが、この関数は&lt;a href="http://mail.scipy.org/pipermail/scipy-dev/2009-September/012893.html"&gt;自由度が1以下の場合はうまくいかないバグ&lt;/a&gt;があるようだ。すくなくともversion 0.7.0で確認した。） &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;#coding: utf-8&lt;br /&gt;import numpy as np&lt;br /&gt;from numpy.random import randn&lt;br /&gt;import scipy as sp&lt;br /&gt;import scipy.signal as signal&lt;br /&gt;&lt;br /&gt;import matplotlib.pyplot as plt &lt;br /&gt;#---------------------------------------&lt;br /&gt;def chi2inv_nint(p,df):&lt;br /&gt;    import scipy.stats as stats&lt;br /&gt;    c=stats.chi2.ppf(p,df)&lt;br /&gt;    return c&lt;br /&gt;&lt;br /&gt;#------------------------------------------&lt;br /&gt;def psd_ex1(tsrs,nfft,ctaper,avfnc):&lt;br /&gt;    """&lt;br /&gt;function [ds_psd,frq]= psd_ex1(tsrs,nfft,ctaper,avfnc)&lt;br /&gt;Power Spectrum Density を直接法によって求めるpython Script&lt;br /&gt;平滑化は周波数領域で行なう．&lt;br /&gt;複数時系列（sz2$gt;1）についても計算する．&lt;br /&gt;入力&lt;br /&gt;tsrs: 入力時系列 (sz1, sz2)各列についてスペクトルを求める&lt;br /&gt;nfft: fft を計算する時間サンプル数&lt;br /&gt;ctaper: taper 関数('hamming','hanning'など)&lt;br /&gt;avfnc: 平滑化ウインドウ&lt;br /&gt;出力&lt;br /&gt;ds_psd: スペクトル密度．１×nfft/2+1．&lt;br /&gt;frq: 周波数．１×nfft/2+1．&lt;br /&gt;todo&lt;br /&gt;PSD の定義に振幅がきちんと合うようにする．&lt;br /&gt;"""&lt;br /&gt;    if tsrs.ndim==1:&lt;br /&gt;        sz1=tsrs.size #tsrs をsz2*1 のデータに変換．&lt;br /&gt;        sz2=1&lt;br /&gt;        tsrs=tsrs.reshape((sz1,1))&lt;br /&gt;    else:&lt;br /&gt;        sz1,sz2=tsrs.shape&lt;br /&gt;    print sz1,nfft&lt;br /&gt;    assert sz1&amp;lt;=nfft, ' sz1$gt;nfft' #nfft はtlng よりも大きくなくてはならない&lt;br /&gt;#満たさないとエラーメッセージを出して終了&lt;br /&gt;    avfnc=avfnc/float(np.sum(avfnc)) #後で説明する平滑化ウインドウの規格化    &lt;br /&gt;    w = getattr(signal, ctaper)(sz1) #実際のtaper 計算&lt;br /&gt;    for n in range(sz2):&lt;br /&gt;        tsrs[:,n]=tsrs[:,n]*w #時系列にテーパーをかける&lt;br /&gt;    tsrs=np.append(tsrs,np.zeros((nfft-sz1+1,sz2)),axis=0) #ゼロパッティング&lt;br /&gt;    famp=sp.fft(tsrs,axis=0) #フーリエ変換&lt;br /&gt;    famp=famp[0:(nfft/2+1),:]/sz1 #実数時系列のスペクトルなら，この範囲のみが必要．&lt;br /&gt;    d_psd=abs(famp)**2; #直接スペクトル値 (d: direct)&lt;br /&gt;    ds_psd=np.zeros_like(d_psd)&lt;br /&gt;    for n in range(sz2):&lt;br /&gt;        ds_psd[:,n]=np.convolve(d_psd[:,n],avfnc,mode='same'); #畳込みを使って平滑化 (ds: direct-smoothed) #畳み込みで増えた部分を除く&lt;br /&gt;    frq=np.arange(nfft/2+1)/float(nfft); #周波数を求めておく&lt;br /&gt;    return ds_psd,frq&lt;br /&gt;&lt;br /&gt;########################################################&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;    plt.figure()&lt;br /&gt;    for npnl in range(4):&lt;br /&gt;        tlng=100; nsmpl=1000&lt;br /&gt;        if npnl==0 :&lt;br /&gt;            nfft=100&lt;br /&gt;            taper=signal.boxcar(tlng)&lt;br /&gt;            ctaper='boxcar'&lt;br /&gt;            avfnc=np.asarray([1, 1, 1, 1, 1]);&lt;br /&gt;            cttl='no padding, boxcar, 5-running'&lt;br /&gt;        elif npnl==1:&lt;br /&gt;            nfft=100&lt;br /&gt;            taper=signal.hamming(tlng)&lt;br /&gt;            ctaper='hamming'&lt;br /&gt;            avfnc=np.asarray([1, 1, 1, 1, 1])&lt;br /&gt;            cttl='no padding, hamming, 5-running'&lt;br /&gt;        elif npnl==2:&lt;br /&gt;            nfft=200&lt;br /&gt;            taper=signal.boxcar(tlng)&lt;br /&gt;            ctaper='boxcar'&lt;br /&gt;            avfnc=np.asarray([1, 1, 1, 1, 1]);&lt;br /&gt;            cttl='double padding, boxcar, 5-running'&lt;br /&gt;        elif npnl==3:&lt;br /&gt;            nfft=200&lt;br /&gt;            taper=signal.hamming(tlng)&lt;br /&gt;            ctaper='hamming'&lt;br /&gt;            avfnc=np.convolve([1, 2, 1],[1, 2, 1])&lt;br /&gt;            cttl='double padding, hamming, double 1-2-1'&lt;br /&gt;    &lt;br /&gt;        tsrs=randn(tlng,nsmpl);&lt;br /&gt;        [ds_psd,frq]=psd_ex1(tsrs,nfft,ctaper,avfnc)&lt;br /&gt;# Monte-Carlo 法で得る90%信頼限界&lt;br /&gt;        srt_psd=np.sort(ds_psd,axis=1)&lt;br /&gt;        c=np.zeros([frq.size,2])                &lt;br /&gt;        c[:,0]=np.log10(srt_psd[:,nsmpl*0.05])&lt;br /&gt;        c[:,1]=np.log10(srt_psd[:,nsmpl*0.95])&lt;br /&gt;        avfnc=avfnc/float(sum(avfnc)) # frequency domain の平滑化関数の規格化&lt;br /&gt;        c0=srt_psd[:,nsmpl*0.5]&lt;br /&gt;&lt;br /&gt;        edof=(1+(1/sum(avfnc**2)-1)*tlng/nfft*np.mean(taper))# 等価自由度の計算&lt;br /&gt;        ce=np.zeros([frq.size,2]) &lt;br /&gt;        ce[:,0]=np.log10(c0*chi2inv_nint(0.050,2*edof)/chi2inv_nint(0.50,2*edof))&lt;br /&gt;        ce[:,1]=np.log10(c0*chi2inv_nint(0.950,2*edof)/chi2inv_nint(0.50,2*edof))&lt;br /&gt;#plot&lt;br /&gt;        plt.subplot(2,2,npnl+1)&lt;br /&gt;        plt.plot(frq,c,'b',frq,ce,'r')&lt;br /&gt;        plt.title(cttl)&lt;br /&gt;        plt.xlabel('frq')&lt;br /&gt;        plt.ylabel('psd')&lt;br /&gt;        if (npnl==0): plt.legend(('Monte-carlo','','Theory'),'lower center',labelspacing=0.05)&lt;br /&gt;    plt.subplots_adjust(wspace=0.6,hspace=0.4)&lt;br /&gt;    plt.savefig("psd_ex1.png")&lt;br /&gt;    plt.show()&amp;nbsp; &lt;/pre&gt;&lt;br /&gt;結果の図&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_DVivl99_vFE/S83APejtdbI/AAAAAAAAAlM/S_4_eECqM6s/s1600/psd_ex1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_DVivl99_vFE/S83APejtdbI/AAAAAAAAAlM/S_4_eECqM6s/s320/psd_ex1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-7208230370914908359?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/7208230370914908359/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=7208230370914908359' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7208230370914908359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7208230370914908359'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/04/blog-post.html' title='スペクトルの推定誤差'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_DVivl99_vFE/S83APejtdbI/AAAAAAAAAlM/S_4_eECqM6s/s72-c/psd_ex1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-8699813028787793694</id><published>2010-04-10T00:18:00.001+09:00</published><updated>2010-04-10T00:19:56.481+09:00</updated><title type='text'>ENSO の周期　psd関数のオプション5 scale_by_freq</title><content type='html'>&lt;br /&gt;&lt;br /&gt;前回の続き。 &lt;br /&gt;これは単なるテクニカルなオプションだが、メモのために記しておく。&lt;br /&gt;&lt;blockquote&gt;*scale_by_freq*: boolean&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Specifies whether the resulting density values should be scaled by the scaling frequency, which gives density in units of Hz^-1. This allows for integration over the returned frequency values. The default is True for MatLab compatibility.&lt;/blockquote&gt;&lt;br /&gt;今まで使ってきた下のような例では、もとは月単位のデータを年単位のデータにしたときに(Fs=12)、自動的に12で割っている（scale_by_freq=Trueがデフォルト)。&lt;br /&gt;すなわち、周波数が(1/2,1/3,1/4, ......)（月単位）の時のスペクトル密度（Pxx2,scale_by_freq=False)の場合と、周波数が（6,4,3, ....)(年単位）の時のスペクトル密度Pxx(scale_by_freq=True)の積分が一致するように&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;Pxx=Pxx2/12&lt;/b&gt;&lt;/div&gt;の関係がある。&lt;br /&gt;下のグラフのようにPxx(黒線）とPxx2/12(赤線）とは一致する。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_DVivl99_vFE/S79ErKSWZ0I/AAAAAAAAAlE/AzTfBJ0xpNE/s1600/NINO_psd_scale.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_DVivl99_vFE/S79ErKSWZ0I/AAAAAAAAAlE/AzTfBJ0xpNE/s320/NINO_psd_scale.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;from read_NINO import read_NINO&lt;br /&gt;&lt;br /&gt;import matplotlib.mlab as mlab&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;import numpy as np&lt;br /&gt;&lt;br /&gt;data=read_NINO()&lt;br /&gt;x=data["NINO3 ANOM"]&lt;br /&gt;Pxx,f=mlab.psd(x, NFFT=len(x),Fs=12)  &lt;br /&gt;Pxx2,f2=mlab.psd(x, NFFT=len(x),Fs=12,scale_by_freq=False) &lt;br /&gt;&lt;br /&gt;plt.figure()&lt;br /&gt;plt.loglog(f,Pxx,'k')&lt;br /&gt;plt.loglog(f2,Pxx2/12.,'r--')&lt;br /&gt;plt.loglog([1./7.,1./7.],[1.E-9,1.E2],'k--')&lt;br /&gt;plt.loglog([1./2.,1./2.],[1.E-9,1.E2],'k--')&lt;br /&gt;plt.savefig("NINO_psd_scale.png")&lt;br /&gt;plt.show()&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-8699813028787793694?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/8699813028787793694/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=8699813028787793694' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/8699813028787793694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/8699813028787793694'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/04/enso-psd5-scalebyfreq.html' title='ENSO の周期　psd関数のオプション5 scale_by_freq'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_DVivl99_vFE/S79ErKSWZ0I/AAAAAAAAAlE/AzTfBJ0xpNE/s72-c/NINO_psd_scale.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-7296392864489367955</id><published>2010-04-08T23:16:00.000+09:00</published><updated>2010-04-08T23:16:47.534+09:00</updated><title type='text'>ENSO の周期　psd関数のオプション4 平滑化</title><content type='html'>&lt;br /&gt;&lt;br /&gt;前回の続き。&lt;br /&gt;これはpsd関数のオプションというわけではないが、Welch法ではなく、得られたスペクトル密度を畳込みによって平滑化してみる。&lt;br /&gt;平滑化には&lt;a href="http://www.scipy.org/Cookbook/SignalSmooth"&gt;scipyのcookbookの例にあるsmooth関数&lt;/a&gt;を用いる。&lt;br /&gt;平滑化にはスペクトルの周波数の解像度を下げるかわりに統計的自由度を上げる働きがある（見延、2001; Hartmann 2008)。 &lt;br /&gt;平滑化には1-2-1フィルタを用いる。numpyでは5点bartlett関数を使うと良い（両端が0）。 &lt;br /&gt;&lt;pre class="prettyprint"&gt;import numpy as np&lt;br /&gt;print np.bartlett(5)&lt;br /&gt;&lt;/pre&gt;[ 0.&amp;nbsp;&amp;nbsp; 0.5&amp;nbsp; 1.&amp;nbsp;&amp;nbsp; 0.5&amp;nbsp; 0. ]&lt;br /&gt;&lt;br /&gt;以下がプログラム例。&lt;br /&gt;黒線がもとのスペクトル密度。&lt;br /&gt;赤線が平滑化したスペクトル密度。&lt;br /&gt;（れいによって2年目と7年目の周期に当たるところに縦の点線）&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_DVivl99_vFE/S73lFSC68DI/AAAAAAAAAk8/scLrg4S8oyY/s1600/NINO_psd_smooth.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_DVivl99_vFE/S73lFSC68DI/AAAAAAAAAk8/scLrg4S8oyY/s320/NINO_psd_smooth.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;from read_NINO import read_NINO&lt;br /&gt;&lt;br /&gt;import matplotlib.mlab as mlab&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;import numpy as np&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;data=read_NINO()&lt;br /&gt;x=data["NINO3 ANOM"]&lt;br /&gt;&lt;br /&gt;#original&lt;br /&gt;Pxx,f=mlab.psd(x, NFFT=len(x),Fs=12)  &lt;br /&gt;&lt;br /&gt;# Smooth by 1-2-1 filter &lt;br /&gt;from cookb_signalsmooth import smooth # from Scipy cookbook&lt;br /&gt;Pxx2=smooth(Pxx[:,0],5,'bartlett') &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#plot&lt;br /&gt;plt.figure()&lt;br /&gt;plt.loglog(f,Pxx,'k-o')&lt;br /&gt;plt.loglog(f,Pxx2,'r-+')&lt;br /&gt;plt.loglog([1./2.,1./2.],[1.E-6,1.E1],'k--') #vertical line for 2 years&lt;br /&gt;plt.loglog([1./7.,1./7.],[1.E-6,1.E1],'k--') #vertical line for 7 years&lt;br /&gt;plt.savefig("NINO_psd_smooth.png")&lt;br /&gt;plt.show()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;参考文献&lt;br /&gt;見延　2001:&lt;a href="http://ocw.hokudai.ac.jp/Course/GraduateSchool/Science/MeteorologyAndOceanology/2001/index.php?lang=ja&amp;amp;page=materials"&gt;大気海洋物理学特論&lt;/a&gt;4 大気海洋統計データ解析　第3章&lt;br /&gt;Hartmann 2008:&lt;a href="http://www.atmos.washington.edu/%7Edennis/552_Notes_ftp.html"&gt;ATM552 講義ノート&lt;/a&gt;第6a章 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-7296392864489367955?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/7296392864489367955/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=7296392864489367955' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7296392864489367955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7296392864489367955'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/04/enso-psd4.html' title='ENSO の周期　psd関数のオプション4 平滑化'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_DVivl99_vFE/S73lFSC68DI/AAAAAAAAAk8/scLrg4S8oyY/s72-c/NINO_psd_smooth.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-2746856081376252171</id><published>2010-04-08T00:07:00.000+09:00</published><updated>2010-04-08T00:07:42.492+09:00</updated><title type='text'>ENSOの周期　psd関数のオプション3 Welch法</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/03/ensopsd2zero-padding.html"&gt;前回&lt;/a&gt;の続き。&lt;br /&gt;ここで用いているpsd関数は、データ長をブロックにわけ、その平均をおこなうことでスペクトル密度をスムーズにするオプションがある(&lt;a href="http://en.wikipedia.org/wiki/Welch%27s_method"&gt;Welch法&lt;/a&gt;）。 &lt;br /&gt;&lt;blockquote&gt;The power spectral density by Welch’s average periodogram method. The vector x is divided into NFFT length blocks. &lt;br /&gt;noverlap: integer    The number of points of overlap between blocks. The default value is 0 (no overlap).&lt;/blockquote&gt;以下がその例。&lt;br /&gt;黒線がオリジナル。&lt;br /&gt;赤線が、データ長を二分割したケース（オーバラップ0）。&lt;br /&gt;青線が、データ超を二分割した上で、50%のオーバラップを許した例。&lt;br /&gt;スペルトル密度の線がなめらかになるのがわかる。&lt;br /&gt;(補助線として2年と7年に対応する周期に縦点線をひいている。）&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DVivl99_vFE/S7yePZCdqaI/AAAAAAAAAk0/hAJc4h98_a4/s1600/NINO_psd_welch.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_DVivl99_vFE/S7yePZCdqaI/AAAAAAAAAk0/hAJc4h98_a4/s320/NINO_psd_welch.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;pre class="prettyprint"&gt;from read_NINO import read_NINO&lt;br /&gt;&lt;br /&gt;import matplotlib.mlab as mlab&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;import numpy as np&lt;br /&gt;&lt;br /&gt;data=read_NINO()&lt;br /&gt;x=data["NINO3 ANOM"]&lt;br /&gt;&lt;br /&gt;#original&lt;br /&gt;Pxx,f=mlab.psd(x, NFFT=len(x),Fs=12)  &lt;br /&gt;&lt;br /&gt;# Date are devided into 2 blocks&lt;br /&gt;#Zero pad to the length of the orignal data sequence.&lt;br /&gt;Pxx2,f2=mlab.psd(x, NFFT=len(x)//2,pad_to=len(x),Fs=12)&lt;br /&gt;&lt;br /&gt;#Date are devided into 2 blocks&lt;br /&gt;#Allow 50 % overlap &lt;br /&gt;#Zero pad to the length of the orignal data sequence.&lt;br /&gt;Pxx3,f3=mlab.psd(x, NFFT=len(x)//2,noverlap=int(0.5*len(x)/2.),pad_to=len(x),Fs=&lt;br /&gt;12)&lt;br /&gt;&lt;br /&gt;#plot&lt;br /&gt;plt.figure()&lt;br /&gt;plt.loglog(f,Pxx,'k-o')&lt;br /&gt;plt.loglog(f2,Pxx2,'r-+')&lt;br /&gt;plt.loglog(f3,Pxx3,'b-x')&lt;br /&gt;plt.loglog([1./2.,1./2.],[1.E-6,1.E1],'k--') #vertical line for 2 years&lt;br /&gt;plt.loglog([1./7.,1./7.],[1.E-6,1.E1],'k--') #vertical line for 7 years&lt;br /&gt;plt.savefig("NINO_psd_welch.png")&lt;br /&gt;plt.show()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;参考&lt;br /&gt;pylab.psd関数のデモ&lt;br /&gt;&lt;a href="http://matplotlib.sourceforge.net/examples/pylab_examples/psd_demo2.html" rel="nofollow"&gt;pylab_examples example code: psd_demo2.py&lt;/a&gt;&lt;br /&gt;MATLABのWelch法の関数pwelch&lt;br /&gt;&lt;a href="http://www.mathworks.com/access/helpdesk_ja_JP/help/toolbox/signal/pwelch.html"&gt;http://www.mathworks.com/access/helpdesk_ja_JP/help/toolbox/signal/pwelch.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-2746856081376252171?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/2746856081376252171/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=2746856081376252171' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/2746856081376252171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/2746856081376252171'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/04/ensopsd3-welch.html' title='ENSOの周期　psd関数のオプション3 Welch法'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_DVivl99_vFE/S7yePZCdqaI/AAAAAAAAAk0/hAJc4h98_a4/s72-c/NINO_psd_welch.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-7958667054969724964</id><published>2010-03-30T22:15:00.001+09:00</published><updated>2010-03-30T22:16:44.368+09:00</updated><title type='text'>ENSOの周期　psd関数のオプション2　Zero padding</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/03/ensopsdtaper.html"&gt;前回&lt;/a&gt;の続き。&lt;br /&gt;pad_toによってzero paddingの量を変えることができる。&lt;br /&gt;&lt;br /&gt;pad_to: integer&lt;quote&gt;The number of points to which the data segment is padded whenperforming the FFT.  This can be different from &lt;i&gt;NFFT&lt;/i&gt;, whichspecifies the number of data points used.  While not increasingthe actual resolution of the &lt;span class="highlight"&gt;psd&lt;/span&gt; (the minimum distance betweenresolvable peaks), this can give more points in the plot,allowing for more detail. This corresponds to the &lt;i&gt;n&lt;/i&gt; parameterin the call to fft(). The default is None, which sets &lt;i&gt;pad_to&lt;/i&gt;equal to &lt;i&gt;NFFT&lt;/i&gt;&lt;/quote&gt; &lt;br /&gt;&lt;br /&gt;下がその例である。&lt;br /&gt;差を良く見るために２年から７年の周期（周波数1/2から1/7)の間だけプロットしている。&lt;br /&gt;黒線がzero paddingを行わない場合。&lt;br /&gt;赤線がデータの長さまで、zero paddingを行う場合。つまり、これはzero paddingを行わないのと同じだ。&lt;br /&gt;青線がデータ長の2倍まで zero paddingを行う場合。より多くの点が加わっていることがわかる。 &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_DVivl99_vFE/S7H429MFteI/AAAAAAAAAkc/DVKCRAAJZJE/s1600/NINO_psd_zeropadding.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_DVivl99_vFE/S7H429MFteI/AAAAAAAAAkc/DVKCRAAJZJE/s320/NINO_psd_zeropadding.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;from read_NINO import read_NINO&lt;br /&gt;&lt;br /&gt;import matplotlib.mlab as mlab&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;import numpy as np&lt;br /&gt;&lt;br /&gt;data=read_NINO()&lt;br /&gt;x=data["NINO3 ANOM"]&lt;br /&gt;Pxx,f=mlab.psd(x, NFFT=len(x),Fs=12)  &lt;br /&gt;# zero padding (length of data) &lt;br /&gt;Pxx2,f2=mlab.psd(x, NFFT=len(x),pad_to=len(x),Fs=12)&lt;br /&gt;# zero padding (length of data) *2&lt;br /&gt;Pxx3,f3=mlab.psd(x, NFFT=len(x),pad_to=2*len(x),Fs=12)&lt;br /&gt;plt.figure()&lt;br /&gt;plt.loglog(f,Pxx,'k-o')&lt;br /&gt;plt.loglog(f2,Pxx2,'r-+')&lt;br /&gt;plt.loglog(f3,Pxx3,'b-x')&lt;br /&gt;plt.xlim([1./7.,1./2.])&lt;br /&gt;plt.ylim([10E-3,10e1])&lt;br /&gt;plt.savefig("NINO_psd_zeropadding.png")&lt;br /&gt;plt.show()&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-7958667054969724964?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/7958667054969724964/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=7958667054969724964' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7958667054969724964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7958667054969724964'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/03/ensopsd2zero-padding.html' title='ENSOの周期　psd関数のオプション2　Zero padding'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_DVivl99_vFE/S7H429MFteI/AAAAAAAAAkc/DVKCRAAJZJE/s72-c/NINO_psd_zeropadding.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-7642664281344255527</id><published>2010-03-29T23:43:00.002+09:00</published><updated>2010-03-29T23:46:51.149+09:00</updated><title type='text'>ENSOの周期　psd関数のオプション１　Taper</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/03/enso.html"&gt;前回&lt;/a&gt;使った&lt;a href="http://matplotlib.sourceforge.net/api/mlab_api.html?highlight=psd#matplotlib.mlab.psd"&gt;matplotlib.mlabのpsd&lt;/a&gt;関数にはいくつかオプションがある。それを試してみよう。&lt;br /&gt;デフォルトではもとのデータにHanningウィンドウ（データ・ウィンドウ、データ・テーパ）をかけている。&lt;br /&gt;これはオプションで変えることができる。&lt;br /&gt;&lt;br /&gt;ウィンドウをはずす場合&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/03/enso.html"&gt;前回のコード&lt;/a&gt;に続けて。&lt;br /&gt;window=mlab.window_noneがウィンドウ無しの場合である。&lt;br /&gt;&lt;pre class="prettyprint"&gt;#window_none()&lt;br /&gt;Pxx_no,f_no=mlab.psd(x, NFFT=len(x),Fs=12,window=mlab.window_none) &lt;br /&gt;plt.figure()&lt;br /&gt;plt.loglog(f,Pxx,'k')&lt;br /&gt;plt.loglog(f_no,Pxx_no,'r')&lt;br /&gt;plt.loglog([1./7.,1./7.],[1.E-9,1.E2],'k--')&lt;br /&gt;plt.loglog([1./2.,1./2.],[1.E-9,1.E2],'k--')&lt;br /&gt;plt.savefig("NINO_psd_no.png")&lt;br /&gt;plt.show()&lt;br /&gt;&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_DVivl99_vFE/S67nMIv2MuI/AAAAAAAAAkM/Mooe_utV8sg/s1600/NINO_psd_no.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_DVivl99_vFE/S67nMIv2MuI/AAAAAAAAAkM/Mooe_utV8sg/s320/NINO_psd_no.png" /&gt;&lt;/a&gt;&lt;/div&gt;データの端の影響でスペクトルの漏れがあり、フィルタ無しの場合（赤線）にはピークの立つ場所が増える。&lt;br /&gt;&lt;br /&gt;次は、Hammingウィンドウをかける場合。&lt;br /&gt;window=np.hamming(len(x))でデータと同じ長さのHammingウィンドウをかけている。&lt;pre class="prettyprint"&gt;#numpy hamming&lt;br /&gt;Pxx_ham,f_ham=mlab.psd(x, NFFT=len(x),Fs=12,window=np.hamming(len(x))) &lt;br /&gt;plt.figure()&lt;br /&gt;plt.loglog(f,Pxx,'k')&lt;br /&gt;plt.loglog(f_ham,Pxx_ham,'r')&lt;br /&gt;plt.loglog([1./7.,1./7.],[1.E-9,1.E2],'k--')&lt;br /&gt;plt.loglog([1./2.,1./2.],[1.E-9,1.E2],'k--')&lt;br /&gt;plt.savefig("NINO_psd_ham.png")&lt;br /&gt;plt.show()&lt;br /&gt;&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_DVivl99_vFE/S67rpKP_WwI/AAAAAAAAAkU/B2VwCqcoKXA/s1600/NINO_psd_ham.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_DVivl99_vFE/S67rpKP_WwI/AAAAAAAAAkU/B2VwCqcoKXA/s320/NINO_psd_ham.png" /&gt;&lt;/a&gt;&lt;/div&gt;このケースではHanningフィルター（黒線）とHammingフィルター(赤線）とではあまり差がないが、一般にはHammingフィルターの方が良いようだ（見延2001)。&lt;br /&gt;&lt;br /&gt;参考文献&lt;br /&gt;見延　2001:&lt;a href="http://ocw.hokudai.ac.jp/Course/GraduateSchool/Science/MeteorologyAndOceanology/2001/index.php?lang=ja&amp;amp;page=materials"&gt;大気海洋物理学特論&lt;/a&gt;4 大気海洋統計データ解析　第3章&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-7642664281344255527?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/7642664281344255527/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=7642664281344255527' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7642664281344255527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7642664281344255527'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/03/ensopsdtaper.html' title='ENSOの周期　psd関数のオプション１　Taper'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_DVivl99_vFE/S67nMIv2MuI/AAAAAAAAAkM/Mooe_utV8sg/s72-c/NINO_psd_no.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-9147970360806355271</id><published>2010-03-28T13:30:00.000+09:00</published><updated>2010-03-28T13:30:32.576+09:00</updated><title type='text'>Matplotlib for Python Developers</title><content type='html'>&lt;br /&gt;&lt;br /&gt;このブログでよく使っている&lt;a href="http://matplotlib.sourceforge.net/"&gt;matplotlib&lt;/a&gt;の本が出ているので、紹介。&lt;br /&gt;&lt;a href="http://gael-varoquaux.info/blog/?p=127"&gt;こちらに書評&lt;/a&gt;が出ている。 &lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=climatechange-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as1&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;md=1X69VDGQCMF7Z30FM082&amp;amp;asins=1847197906" style="height: 240px; width: 120px;"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-9147970360806355271?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/9147970360806355271/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=9147970360806355271' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/9147970360806355271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/9147970360806355271'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/03/matplotlib-for-python-developers.html' title='Matplotlib for Python Developers'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-5258788619599836731</id><published>2010-03-12T22:43:00.000+09:00</published><updated>2010-03-12T22:43:03.921+09:00</updated><title type='text'>ENSOの周期</title><content type='html'>&lt;br /&gt;&lt;br /&gt;ENSO(エルニーニョ）の周期を見てみる。&lt;br /&gt;&lt;br /&gt;データは&lt;a href="http://oceansciencehack.blogspot.com/2010/03/nino.html"&gt;前回作ったモジュール&lt;/a&gt;でNINO3領域ののアノマリを得る。&lt;br /&gt;&lt;br /&gt;スペクトル密度を求める関数が&lt;a href="http://matplotlib.sourceforge.net/api/mlab_api.html"&gt;matplotlib.mlab&lt;/a&gt;(Matlab風の関数群）に&lt;a href="http://matplotlib.sourceforge.net/api/mlab_api.html#matplotlib.mlab.psd"&gt;psd&lt;/a&gt;としてある。&lt;br /&gt;(図まで描いてくれる&lt;a href="http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.psd"&gt;matplotlib.pyplotのpsd&lt;/a&gt;というのもある。）&lt;br /&gt;&lt;br /&gt;そのpsdを用いて作ったスペクトル密度の図とプログラムが以下の通り。&lt;br /&gt;データ数（NFFT）はすべてを使う。&lt;br /&gt;時間の単位は年とする。毎月のデータがあるから単位時間あたりのサンプル数(Fs)は12。&lt;br /&gt;&lt;a href="http://www.nies.go.jp/kanko/news/16/16-6/16-6-04.html"&gt;エルニーニョは2年から7年の周期があると言われている&lt;/a&gt;から補助線として2年(周波数1/2)と7年（周波数1/7)に当たるところに補助線（点線）を引いている。実際、それらの間にスペクトルピークが見られている。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DVivl99_vFE/S5oHpgfS-fI/AAAAAAAAAjI/MTMDR7fmk34/s1600-h/NINO_psd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_DVivl99_vFE/S5oHpgfS-fI/AAAAAAAAAjI/MTMDR7fmk34/s320/NINO_psd.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;pre class="prettyprint"&gt;from read_NINO import read_NINO&lt;br /&gt;&lt;br /&gt;import matplotlib.mlab as mlab&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;&lt;br /&gt;data=read_NINO()&lt;br /&gt;x=data["NINO3 ANOM"]&lt;br /&gt;Pxx,f=mlab.psd(x, NFFT=len(x),Fs=12)  &lt;br /&gt;plt.figure()&lt;br /&gt;plt.loglog(f,Pxx)&lt;br /&gt;plt.loglog([1./7.,1./7.],[1.E-9,1.E2],'k--')&lt;br /&gt;plt.loglog([1./2.,1./2.],[1.E-9,1.E2],'k--')&lt;br /&gt;plt.savefig("NINO_psd.png")&lt;br /&gt;plt.show()&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-5258788619599836731?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/5258788619599836731/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=5258788619599836731' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/5258788619599836731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/5258788619599836731'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/03/enso.html' title='ENSOの周期'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_DVivl99_vFE/S5oHpgfS-fI/AAAAAAAAAjI/MTMDR7fmk34/s72-c/NINO_psd.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-6239206712351224798</id><published>2010-03-06T16:20:00.002+09:00</published><updated>2010-05-26T23:42:35.640+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data'/><title type='text'>エルニーニョ: NINO監視領域の温度偏差</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="background-color: #eeeeee;"&gt;&lt;a href="http://www.nikkei.co.jp/news/shakai/20100302ATDG0103P01032010.html"&gt;&lt;b&gt;寒暖の差大きく、大雪も　12～２月、気象庁まとめ　（日経新聞)&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;気象庁は１日、この冬（昨年12月～今年２月）の天候まとめを発表した。３カ月間の平均気温は全国的に高めとなったものの、暖冬をもたらす「エルニーニョ現象」と北極域の気圧が高くなる「北極振動」の影響で、例年以上に寒暖の差が大きくなった。　気象庁によると、今冬はエルニーニョ現象の影響で西高東低の冬型の気圧配置が長続きせず、平均気温は西日本で平年より1.0度、東日本で0.9度、北日本と沖縄・奄美は0.6度高くなった。　季節外れの暖かさとなったのは１月下旬と２月下旬で、２月25日には全国約160カ所で、２月の最高気温の記録を更新した。(01日　19:53)&lt;/blockquote&gt;エルニーニョを話題とする。エルニーニョを監視するために、東太平洋のエルニーニョ監視領域の海面温度がよく使われる。&lt;a href="http://www.cpc.ncep.noaa.gov/products/analysis_monitoring/ensostuff/nino_regions.shtml"&gt;エルニーニョ監視領域&lt;/a&gt;&lt;br /&gt;エルニーニョ監視領域の温度とその平年値からの偏差(anomaly)のデータは&lt;a href="http://www.cpc.noaa.gov/data/indices/sstoi.indices"&gt;NOAAのclimate predictionセンターから手に入る&lt;/a&gt;。&lt;a href="http://www.cpc.noaa.gov/data/indices/"&gt;ここの情報&lt;/a&gt;によれば、平年値は1971年から2000年までの平均で定義される。&lt;br /&gt;&lt;br /&gt;以下は、これらのエルニーニョ監視領域の絶対値と偏差をネットから取得するモジュールと、４つの監視領域の偏差をデータ全期間もしくは過去48ヶ月分プロットするプログラムである。今回は正で赤、負で青で塗り分けるために、matplotlibの&lt;a href="http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.fill_between"&gt;fill_between&lt;/a&gt;を使った。&lt;br /&gt;&lt;br /&gt;NINO_all.png&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DVivl99_vFE/S5H_9cuIGlI/AAAAAAAAAi0/XcODbXY_CL4/s1600-h/NINO_all.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_DVivl99_vFE/S5H_9cuIGlI/AAAAAAAAAi0/XcODbXY_CL4/s320/NINO_all.png" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;NINO_48months.png&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DVivl99_vFE/S5IAK4BRp4I/AAAAAAAAAi8/aLUt3QXi7A4/s1600-h/NINO_48months.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_DVivl99_vFE/S5IAK4BRp4I/AAAAAAAAAi8/aLUt3QXi7A4/s320/NINO_48months.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;read_NINO.py&lt;br /&gt;&lt;pre class="prettyprint"&gt;import numpy as np&lt;br /&gt;import scikits.timeseries as ts&lt;br /&gt;&lt;br /&gt;def read_NINO():&lt;br /&gt;    """&lt;br /&gt;    output output NINO index data&lt;br /&gt;    data souce is http://www.cpc.ncep.noaa.gov/data/indices/sstoi.indices&lt;br /&gt;    Explanation is http://www.cpc.ncep.noaa.gov/data/indices/&lt;br /&gt;    usage:  from read_NINO import read_NINO &lt;br /&gt;            data=read_NINO()&lt;br /&gt;    outputs are     &lt;br /&gt;    data["NINO1+2"]     : NINO1+2  &lt;br /&gt;    data["NINO1+2 ANOM"]: NINO1+2 ANOMARY  &lt;br /&gt;    data["NINO3"]       : NINO3&lt;br /&gt;    data["NINO3 ANOM"]  : NINO3 ANOMALY&lt;br /&gt;    data["NINO4"]       : NINO4&lt;br /&gt;    data["NINO4 ANOM"]  : NINO4 ANOMALY&lt;br /&gt;    data["NINO3.4"]     : NINO3.4&lt;br /&gt;    data["NINO3.4 ANOM"]: NINO3.4 ANOMALY  &lt;br /&gt;    """  &lt;br /&gt;    ninodata={}&lt;br /&gt;    names=('YEAR','MONTH','NINO1+2','NINO1+2 ANOM','NINO3','NINO3 ANOM','NINO4','NINO4 ANOM','NINO3.4','NINO3.4 ANOM')&lt;br /&gt;    ds = np.DataSource(None)&lt;br /&gt;    f=ds.open('http://www.cpc.ncep.noaa.gov/data/indices/sstoi.indices')&lt;br /&gt;    data=np.loadtxt(f,skiprows=1,\&lt;br /&gt;         dtype={'formats':('i4','i4','f4','f4','f4','f4','f4','f4','f4','f4'),\&lt;br /&gt;                'names': names})&lt;br /&gt;    firstday=ts.Date(freq='M',year=data['YEAR'][0],month=data['MONTH'][0])&lt;br /&gt;    for n in names[2:]:&lt;br /&gt;          ninodata[n]=ts.time_series(data[n],start_date=firstday,freq='M')&lt;br /&gt;    return ninodata&lt;br /&gt;&lt;br /&gt;#######################################################################&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;    import matplotlib.pyplot as plt&lt;br /&gt;    import matplotlib.dates as mdates&lt;br /&gt;&lt;br /&gt;    data=read_NINO()&lt;br /&gt;&lt;br /&gt;#plot&lt;br /&gt;    for nt in range(2):&lt;br /&gt;        temp=data['NINO3'].dates # dummy to get dates of time series&lt;br /&gt;&lt;br /&gt;        if nt==0:   # all data&lt;br /&gt;            t=ts.date_array(start_date=temp[0],end_date=temp[-1])&lt;br /&gt;            figname="NINO_all.png"&lt;br /&gt;        else:       # last 48 months&lt;br /&gt;            t=ts.date_array(start_date=temp[-1]-47,end_date=temp[-1])&lt;br /&gt;            figname="NINO_48months.png"&lt;br /&gt;&lt;br /&gt;        fig=plt.figure() &lt;br /&gt;        names=('NINO1+2 ANOM','NINO3 ANOM','NINO4 ANOM','NINO3.4 ANOM')&lt;br /&gt;        for n,name in enumerate(names):&lt;br /&gt;            x=(data[name])[t].dates.tolist()&lt;br /&gt;            y=(data[name])[t].series&lt;br /&gt;            ax=fig.add_subplot(len(names),1,n+1)&lt;br /&gt;            ax.plot(x,y,'k-')&lt;br /&gt;            ax.fill_between(x,y1=y,y2=0,facecolor='red',where=y&amp;gt;=0)  #positive red&lt;br /&gt;            ax.fill_between(x,y1=y,y2=0,facecolor='blue',where=y&amp;lt;=0)  #positive red&lt;br /&gt;            if (nt==0): # axis for all data &lt;br /&gt;                years    = mdates.YearLocator(5) #major tick every 5 years &lt;br /&gt;                ax.xaxis.set_major_locator(years)&lt;br /&gt;            else:       # axis for latst 48 months&lt;br /&gt;                years    = mdates.YearLocator(1) #major tick every 1 year&lt;br /&gt;                ax.xaxis.set_major_locator(years)&lt;br /&gt;                months    = mdates.MonthLocator() # minor tick every month&lt;br /&gt;                ax.xaxis.set_minor_locator(months) &lt;br /&gt;            plt.title(name)                  #tile&lt;br /&gt;        plt.subplots_adjust(hspace=0.5)             #adjust subplot scape &lt;br /&gt;        plt.savefig(figname)&lt;br /&gt;        plt.show()&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-6239206712351224798?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/6239206712351224798/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=6239206712351224798' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/6239206712351224798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/6239206712351224798'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/03/nino.html' title='エルニーニョ: NINO監視領域の温度偏差'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_DVivl99_vFE/S5H_9cuIGlI/AAAAAAAAAi0/XcODbXY_CL4/s72-c/NINO_all.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-4573269502396893362</id><published>2010-03-04T21:32:00.004+09:00</published><updated>2010-05-26T23:42:06.176+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data'/><title type='text'>串本と浦神の潮位差　(日平均データ）</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/02/blog-post_09.html"&gt;以前&lt;/a&gt;、串本と浦神の潮位差の月平均データを読んだが、今回は日データを読む。&lt;br /&gt;データは気象庁のサイトで手に入れることができる(速報値）。&lt;br /&gt;&lt;a href="http://www.data.kishou.go.jp/kaiyou/db/kobe/kuroshio/chouisa/chouisa.php"&gt;http://www.data.kishou.go.jp/kaiyou/db/kobe/kuroshio/chouisa/chouisa.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;以下は、データを読むモジュールと時系列プロットするプログラム。&lt;br /&gt;&lt;br /&gt;2010/4/6 追記　&lt;a href="http://www.data.kishou.go.jp/kaiyou/db/kobe/kuroshio/chouisa/chouisa.php"&gt;データのフォーマットと値に修正&lt;/a&gt;があり、それに伴いプログラムと図を変更してある。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_DVivl99_vFE/S49f8AQdJHI/AAAAAAAAAis/qmBIGQVSCNg/s1600-h/kushimoto_uragami_daily.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://1.bp.blogspot.com/_DVivl99_vFE/S7rBtWhjL9I/AAAAAAAAAkk/BmGLzmf5QdU/s1600/kushimoto_uragami_daily.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_DVivl99_vFE/S7rBtWhjL9I/AAAAAAAAAkk/BmGLzmf5QdU/s320/kushimoto_uragami_daily.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;import numpy as np&lt;br /&gt;import scikits.timeseries as ts&lt;br /&gt;&lt;br /&gt;def read_kushimoto_uragami_daily():&lt;br /&gt;    day=[]&lt;br /&gt;    value=[]&lt;br /&gt;    ds = np.DataSource(None)&lt;br /&gt;    f=ds.open('http://www.data.kishou.go.jp/kaiyou/db/kobe/kuroshio/chouisa/chou&lt;br /&gt;isa.dat')&lt;br /&gt;    l=0&lt;br /&gt;    for line in f:&lt;br /&gt;         l+=1&lt;br /&gt;         if (l$gt;1): # skip one line&lt;br /&gt;             fields =line.strip().split()&lt;br /&gt;             if len(fields)$gt;=1: day.append(fields[0])&lt;br /&gt;             if len(fields)==1:&lt;br /&gt;                 value.append(-999.)&lt;br /&gt;             elif len(fields)==2:&lt;br /&gt;                 try:&lt;br /&gt;                     a=float(fields[1]) # check if it is number&lt;br /&gt;                     value.append(a)&lt;br /&gt;                 except:&lt;br /&gt;                     value.append(-999.) # if data is not number&lt;br /&gt;    f.close()&lt;br /&gt;    valuea=np.asarray(value,dtype='float32')&lt;br /&gt;    kushimoto_uragami=ts.time_series(valuea,start_date=day[0],freq='d',mask=(val&lt;br /&gt;uea&amp;lt;-990.))    &lt;br /&gt;    return kushimoto_uragami&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;    import matplotlib.pyplot as plt&lt;br /&gt;    import scikits.timeseries.lib.plotlib as tpl&lt;br /&gt;&lt;br /&gt;    kushimoto_uragami=read_kushimoto_uragami_daily()&lt;br /&gt;&lt;br /&gt;    fig = tpl.tsfigure()&lt;br /&gt;    fsp = fig.add_tsplot(111)&lt;br /&gt;    fsp.tsplot(kushimoto_uragami, '-')&lt;br /&gt;    plt.xlabel("YEAR")&lt;br /&gt;    plt.ylabel("Kushimoto-Uragami (cm)")&lt;br /&gt;    plt.savefig("kushimoto_uragami_daily.png")&lt;br /&gt;    plt.show()&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-4573269502396893362?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/4573269502396893362/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=4573269502396893362' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/4573269502396893362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/4573269502396893362'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/03/blog-post.html' title='串本と浦神の潮位差　(日平均データ）'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_DVivl99_vFE/S7rBtWhjL9I/AAAAAAAAAkk/BmGLzmf5QdU/s72-c/kushimoto_uragami_daily.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-3945148976839546275</id><published>2010-02-17T00:11:00.002+09:00</published><updated>2010-02-18T00:38:13.845+09:00</updated><title type='text'>串本・浦神の潮位差と黒潮流路緯度　Scipyでregression</title><content type='html'>&lt;br /&gt;&lt;br /&gt;regressionはscipyでも行える。&lt;a href="http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.linregress.html#scipy.stats.linregress"&gt;stats.linregress&lt;/a&gt;関数（実際にはmasked array用の&lt;a href="http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mstats.linregress.html"&gt;stats.mstat.linregress&lt;/a&gt;)を使う。&lt;br /&gt;参照　&lt;a href="http://www.scipy.org/Cookbook/LinearRegression"&gt;Cookbook/Linear Regression&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;#read module&lt;br /&gt;from scipy import stats&lt;br /&gt;&lt;br /&gt;from read_kuroshio_lat import read_kuroshio_lat&lt;br /&gt;from read_kushimoto_uragami import read_kushimoto_uragami&lt;br /&gt;&lt;br /&gt;#read data&lt;br /&gt;kuroshio_lat=read_kuroshio_lat()&lt;br /&gt;kushimoto_uragami=read_kushimoto_uragami()   &lt;br /&gt;&lt;br /&gt;#calculate regression&lt;br /&gt;(a_s,b_s,r,prob,stderr,c)=stats.mstats.linregress(kushimoto_uragami,kuroshio_lat)&lt;br /&gt;print "slope=",a_s&lt;br /&gt;print "intersect=",b_s&lt;br /&gt;print "correlation=",r&lt;br /&gt;print "p value=",prob&lt;br /&gt;print "std. of residuals",stderr&lt;br /&gt;print "(Var. Latitude)/(Var. Sea level)=",c&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;最後のcはマニュアルには無いが、ソースコードを見てみたところ(ipythonでは&lt;span style="background-color: #fff2cc;"&gt;stats.mstats.linregress??&lt;/span&gt;で見ることができる。scipy version 0.7.0）、それぞれの変数の分散の比になっていた。結果は&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;slope= 0.0666657&lt;br /&gt;intersect= 31.9559306074&lt;br /&gt;correlation= 0.618468&lt;br /&gt;p value= 4.38452479663e-62&lt;br /&gt;std. of residuals 0.62129592706&lt;br /&gt;(Var. Latitude)/(Var. Sea level)= 0.011619&lt;/pre&gt;&lt;/blockquote&gt;regressionの線も引いてみよう。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://4.bp.blogspot.com/_DVivl99_vFE/S3qzcPqP5GI/AAAAAAAAAik/fxNsRTF3k54/s1600-h/kurosho_reg_scipy.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_DVivl99_vFE/S3qzcPqP5GI/AAAAAAAAAik/fxNsRTF3k54/s320/kurosho_reg_scipy.png" /&gt;&lt;/a&gt;&lt;/div&gt;プログラムはmatplotlibを使って以下のようになる。&lt;br /&gt;&lt;pre class="prettyprint"&gt;#plot&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;import numpy as np&lt;br /&gt;&lt;br /&gt;x=np.arange(-7.,35.,1.) # x data from -7 to 35 step 1&lt;br /&gt;y=a_s*x+b_s         # regression line&lt;br /&gt;&lt;br /&gt;plt.figure()&lt;br /&gt;plt.plot(kushimoto_uragami,kuroshio_lat,'.') # plot data&lt;br /&gt;plt.plot(x,y,'r-') # plot regression line&lt;br /&gt;plt.xlabel("Kushimoto-Uragami")&lt;br /&gt;plt.ylabel("Kuroshio Latitude")&lt;br /&gt;plt.xlim((-7.,35.))&lt;br /&gt;plt.ylim((30.,33.5))&lt;br /&gt;plt.savefig("kurosho_reg_scipy.png")&lt;br /&gt;plt.show()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;今回はつかわなかったが、以下の情報もある。&lt;br /&gt;&lt;a href="http://www.scipy.org/Cookbook/OLS"&gt;Cookbook/Fit Statistics&amp;nbsp;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://scikits.appspot.com/statsmodels"&gt;Scikits.statsmodels&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://article.gmane.org/gmane.comp.python.scientific.user/2358/match=regression"&gt;multiple regression&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-3945148976839546275?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/3945148976839546275/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=3945148976839546275' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/3945148976839546275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/3945148976839546275'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/02/regressionscipy-stats.html' title='串本・浦神の潮位差と黒潮流路緯度　Scipyでregression'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_DVivl99_vFE/S3qzcPqP5GI/AAAAAAAAAik/fxNsRTF3k54/s72-c/kurosho_reg_scipy.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-5861957860627684996</id><published>2010-02-14T23:36:00.002+09:00</published><updated>2010-05-14T16:15:24.513+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>串本・浦神の潮位差と黒潮流路緯度　Rで線形モデル　（続き2）</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/02/r_13.html"&gt;前回&lt;/a&gt;のさらに続き。推定値・予測値の信頼区間も描くことができる。 &lt;br /&gt;&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/02/r.html"&gt;前々回&lt;/a&gt;もとめた係数をα、切片をβとすると、&lt;br /&gt;(1) -7から35を1刻みで分割した串本・浦神の各点x0&lt;br /&gt;(2) αx0+βの推定値、およびその99%信頼区間&lt;br /&gt;(3)&amp;nbsp; αx0+βの推定値、および値αx0+β+ε0（ε0はx0で混入する誤差）の予測値の99%信頼区間&lt;br /&gt;(4)&amp;nbsp; αx0+βの推定値および予測値の信頼区間を黒、推定値の信頼区間を青でプロット　（計6本の線。直線ではない）。&lt;br /&gt;(5) グラフを重ねがきする。&lt;br /&gt;(6) データ点をプロットする。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;rscript="""&lt;br /&gt;new&amp;lt;-data.frame(rlevel=seq(-7,35,1))  # (1)&lt;br /&gt;png(\'kuroshio_reg_R3.png\')&lt;br /&gt;dc&amp;lt;-predict(fm,new,interval="confidence",level=0.99) #(2)   &lt;br /&gt;dp&amp;lt;-predict(fm,new,interval="prediction",level=0.99) #(3)&lt;br /&gt;matplot(new$rlevel,cbind(dp,dc),lty=1,col=c("black","black","black","black","blue","blue"),type="l",xlab="",ylab="",xlim=c(-7, 35),ylim=c(30,33.5))　 #(4)&lt;br /&gt;par(new=T) #(5)&lt;br /&gt;plot(rlevel,rlat,xlab=\"Kushimoto-Uragami\",ylab=\"Kuroshio Latitude\",xlim=c(-7, 35),ylim=c(30,33.5))  #(6)&lt;br /&gt;dev.off()     &lt;br /&gt;"""&lt;br /&gt;r(rscript)&lt;/pre&gt;図&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_DVivl99_vFE/S3f9ajYeneI/AAAAAAAAAiU/RYV64GGGDfI/s1600-h/kuroshio_reg_R3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_DVivl99_vFE/S3f9ajYeneI/AAAAAAAAAiU/RYV64GGGDfI/s320/kuroshio_reg_R3.png" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;参考:　やさしい医学統計手法　6.二標本の関連性を見る。&lt;/div&gt;&lt;a href="http://www3.ocn.ne.jp/%7Estat/medical/med_023.htm"&gt;http://www3.ocn.ne.jp/~stat/medical/med_023.htm&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-5861957860627684996?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/5861957860627684996/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=5861957860627684996' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/5861957860627684996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/5861957860627684996'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/02/r2.html' title='串本・浦神の潮位差と黒潮流路緯度　Rで線形モデル　（続き2）'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_DVivl99_vFE/S3f9ajYeneI/AAAAAAAAAiU/RYV64GGGDfI/s72-c/kuroshio_reg_R3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-5597214785172012072</id><published>2010-02-13T10:36:00.002+09:00</published><updated>2010-05-14T16:15:05.149+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>串本・浦神の潮位差と黒潮流路緯度　Rで線形モデル　（続き）</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/02/r.html"&gt;前回&lt;/a&gt;の続き。 &lt;br /&gt;以下のようにして残差(residuals)に関するプロットを作ることができる。&lt;br /&gt;(1) 図を四分割し、上下左右の間隔を指定。現在の作図パラメータはoparに退避。&lt;br /&gt;(2）4種類の診断図を一度に描く。&lt;br /&gt;(3) 作図パラメータをもとにもどす。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;r('png(\'kuroshio_reg_R2.png\')')&lt;br /&gt;r('opar&amp;lt;-par(mfrow=c(2,2),oma=c(0,0,1.1,0))')　　#(1)&lt;br /&gt;r('plot(fm)')                                       #(2)&lt;br /&gt;r('par(opar)')                                      #(3)  &lt;br /&gt;r('dev.off()')&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;図&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DVivl99_vFE/S3WGjEBlg4I/AAAAAAAAAiM/ZCJI02VInP4/s1600-h/kuroshio_reg_R2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_DVivl99_vFE/S3WGjEBlg4I/AAAAAAAAAiM/ZCJI02VInP4/s320/kuroshio_reg_R2.png" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;左上：　予測値対残差。残差が1.96σを超える（正規分布で95%内に入っていない）データにはデータ番号が示されている。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;右上：　標準化された残差に対する累積比率に対する正規Q-Qプロット。残差が正規分布しているか。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;左下：　残差の標準化の絶対値の平方根を予測値に対してプロットしている。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;右下：　leverage(梃子比: 回帰直線への影響度）と標準化された残差。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;例えば、右上は黒潮の緯度が高い（日本に近い）場合には、回帰直線は過大評価になっている。これは陸地があるので、それ以上は高い位置にいけないからであろう。緯度が低い（沿岸から離れる）場合に値がばらついているのは、黒潮が十分に岸から離れている場合には串本・浦神の潮位差は0に近く、黒潮の離岸距離との関係がうすまっていると考えられる。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=climatechange-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as1&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;md=1X69VDGQCMF7Z30FM082&amp;amp;asins=4901683128" style="height: 240px; width: 120px;"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-5597214785172012072?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/5597214785172012072/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=5597214785172012072' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/5597214785172012072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/5597214785172012072'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/02/r_13.html' title='串本・浦神の潮位差と黒潮流路緯度　Rで線形モデル　（続き）'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_DVivl99_vFE/S3WGjEBlg4I/AAAAAAAAAiM/ZCJI02VInP4/s72-c/kuroshio_reg_R2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-8486652896504392230</id><published>2010-02-11T17:52:00.016+09:00</published><updated>2010-05-14T16:03:12.509+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>串本・浦神の潮位差と黒潮流路緯度　Rで線形モデル</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/02/read-module-from-readkuroshiolat-import.html"&gt;前回&lt;/a&gt;の続き。今回は&lt;a href="http://rpy.sourceforge.net/rpy2.html"&gt;rpy2&lt;/a&gt;を通して&lt;a href="http://www.r-project.org/"&gt;R&lt;/a&gt;を使い、串本・浦神の潮位差と黒潮流路緯度を線形モデルとして評価してみる。&lt;br /&gt;(1) データをRに渡し、scatter plotを描く。&lt;br /&gt;(2) 潮位差(rlevel)と黒潮緯度(rlat)の線形モデルを考える。&lt;br /&gt;(3) 線形モデルをもとに、regression line の直線を引く。&lt;br /&gt;(4) 線形モデルの結果を打ち出す。&lt;br /&gt;missing valueもmasked arrayから自動的に選別して除いてくれているようだ。&lt;br /&gt;&lt;pre class="prettyprint"&gt;#read module&lt;br /&gt;#for data&lt;br /&gt;from read_kuroshio_lat import read_kuroshio_lat&lt;br /&gt;from read_kushimoto_uragami import read_kushimoto_uragami&lt;br /&gt;&lt;br /&gt;#for R&lt;br /&gt;import rpy2.robjects as robjects&lt;br /&gt;&lt;br /&gt;#read data&lt;br /&gt;kuroshio_lat=read_kuroshio_lat()&lt;br /&gt;kushimoto_uragami=read_kushimoto_uragami()   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#for R&lt;br /&gt;rlat=robjects.FloatVector(kuroshio_lat)&lt;br /&gt;rlevel=robjects.FloatVector(kushimoto_uragami)&lt;br /&gt;robjects.globalEnv["rlat"] = rlat&lt;br /&gt;robjects.globalEnv["rlevel"] = rlevel&lt;br /&gt;r=robjects.r&lt;br /&gt;r('png(\'kuroshio_reg_R.png\')')    &lt;br /&gt;r('plot(rlevel,rlat,xlab=\"Kushimoto-Uragami\",ylab=\"Kuroshio Latitude\")') #scatter plot &lt;br /&gt;r('fm&amp;lt;-lm(rlat ~ rlevel)')  # linear model&lt;br /&gt;r('abline(fm)')             # plot regression line&lt;br /&gt;r('dev.off()')            &lt;br /&gt;summary=r('sm&amp;lt;-summary(fm)')&lt;br /&gt;print summary&lt;br /&gt;&lt;/pre&gt;図&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DVivl99_vFE/S3OyOU5KEnI/AAAAAAAAAiE/arN_zS4XrLk/s1600-h/kuroshio_reg_R.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_DVivl99_vFE/S3OyOU5KEnI/AAAAAAAAAiE/arN_zS4XrLk/s320/kuroshio_reg_R.png" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="background-color: white; clear: both; text-align: left;"&gt;summaryの出力&lt;/div&gt;&lt;div class="separator" style="background-color: #f3f3f3; clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;span style="background-color: #f3f3f3;"&gt;Call:&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #f3f3f3;"&gt;lm(formula = rlat ~ rlevel)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #f3f3f3;"&gt;Residuals:&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Min&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1Q&amp;nbsp;&amp;nbsp; Median&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3Q&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Max &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #f3f3f3;"&gt;-3.17592 -0.32259&amp;nbsp; 0.08407&amp;nbsp; 0.40907&amp;nbsp; 1.30406 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #f3f3f3;"&gt;Coefficients:&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Estimate Std. Error t value Pr(&amp;gt;|t|)&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #f3f3f3;"&gt;(Intercept) 31.955937&amp;nbsp;&amp;nbsp; 0.038044&amp;nbsp; 839.98&amp;nbsp;&amp;nbsp; &amp;lt;2e-16 ***&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #f3f3f3;"&gt;rlevel&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.066666&amp;nbsp;&amp;nbsp; 0.003672&amp;nbsp;&amp;nbsp; 18.15&amp;nbsp;&amp;nbsp; &amp;lt;2e-16 ***&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #f3f3f3;"&gt;---&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #f3f3f3;"&gt;Signif. codes:&amp;nbsp; 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #f3f3f3;"&gt;Residual standard error: 0.6225 on 532 degrees of freedom&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #f3f3f3;"&gt;&amp;nbsp; (42 observations deleted due to missingness)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #f3f3f3;"&gt;Multiple R-squared: 0.3825,&amp;nbsp;&amp;nbsp; &amp;nbsp;Adjusted R-squared: 0.3813 &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #f3f3f3;"&gt;F-statistic: 329.5 on 1 and 532 DF,&amp;nbsp; p-value: &amp;lt; 2.2e-16 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;線形モデルの係数は&lt;span style="background-color: white;"&gt;0.066666&lt;/span&gt;、切片は&lt;span style="background-color: white;"&gt;31.955937&lt;/span&gt;。&lt;br /&gt;ともにp値は小さく&lt;span style="background-color: white;"&gt;(2e-16)&lt;/span&gt;、0であるという帰無仮説は棄却できる。&lt;br /&gt;線形モデルのR^2値は約38%で、&lt;a href="http://oceansciencehack.blogspot.com/2010/02/read-module-from-readkuroshiolat-import.html"&gt;前回&lt;/a&gt;求めた相関係数0.62の2乗になっている。&lt;br /&gt;&lt;br /&gt;係数などは以下のようにとりだせる。&lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #eeeeee;"&gt;print summary.names&lt;/span&gt;&lt;/blockquote&gt;&amp;nbsp;[1] "call"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "terms"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "residuals"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "coefficients" &lt;br /&gt;&amp;nbsp;[5] "aliased"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "sigma"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "df"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "r.squared"&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;[9] "adj.r.squared" "fstatistic"&amp;nbsp;&amp;nbsp;&amp;nbsp; "cov.unscaled"&amp;nbsp; "na.action"&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #eeeeee;"&gt;cf=r('cf&amp;lt;-sm$coefficients')&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;print cf.names&lt;/span&gt;&lt;/blockquote&gt;[[1]]&lt;br /&gt;[1] "(Intercept)" "rlevel"&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;[[2]]&lt;br /&gt;[1] "Estimate"&amp;nbsp;&amp;nbsp; "Std. Error" "t value"&amp;nbsp;&amp;nbsp;&amp;nbsp; "Pr(&amp;gt;|t|)" &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #eeeeee;"&gt;for i in range(8):&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print cf[i]&lt;/span&gt;&lt;/blockquote&gt;31.9559366577&lt;br /&gt;0.066665747972&lt;br /&gt;0.0380437732903&lt;br /&gt;0.00367237036394&lt;br /&gt;839.978106637&lt;br /&gt;18.1533291486&lt;br /&gt;0.0&lt;br /&gt;1.13483941203e-57&lt;br /&gt;&lt;br /&gt;参考：単回帰&lt;a href="http://www.geocities.jp/kashiwabara_fact/statistics-tankaiki.htm"&gt;http://www.geocities.jp/kashiwabara_fact/statistics-tankaiki.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;関連ポスト&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/01/r.html"&gt;北極振動　Rで統計&lt;/a&gt;&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/01/r_23.html"&gt;北極振動　Rで統計グラフ編 &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-8486652896504392230?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/8486652896504392230/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=8486652896504392230' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/8486652896504392230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/8486652896504392230'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/02/r.html' title='串本・浦神の潮位差と黒潮流路緯度　Rで線形モデル'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_DVivl99_vFE/S3OyOU5KEnI/AAAAAAAAAiE/arN_zS4XrLk/s72-c/kuroshio_reg_R.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-7579383433422448054</id><published>2010-02-10T23:49:00.001+09:00</published><updated>2010-02-11T16:10:31.714+09:00</updated><title type='text'>串本と浦神の潮位差と黒潮流路位置の相関</title><content type='html'>&lt;br /&gt;&lt;br /&gt;串本と浦神の潮位差が黒潮の流路のよい指標となることは経験的に知られている（&lt;a href="http://www.data.kishou.go.jp/kaiyou/db/kaikyo/knowledge/kuroshio.html#sealevel"&gt;参考:気象庁&lt;/a&gt;）。&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/02/blog-post_1073.html"&gt;前々回&lt;/a&gt;作った黒潮の流路の緯度を読むプログラムと、&lt;a href="http://oceansciencehack.blogspot.com/2010/02/blog-post_09.html"&gt;前回&lt;/a&gt;作った串本と浦神の潮位差を読むプログラムをモジュールとして用いて、潮位差を横軸に、流路緯度を縦軸にプロットしてみた。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_DVivl99_vFE/S3LBojr7A5I/AAAAAAAAAh8/7Is5Pk0zpqI/s1600-h/kurosho_corr.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_DVivl99_vFE/S3LBojr7A5I/AAAAAAAAAh8/7Is5Pk0zpqI/s320/kurosho_corr.png" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;blockquote style="background-color: #eeeeee;"&gt;#read module&lt;br /&gt;from read_kuroshio_lat import read_kuroshio_lat&lt;br /&gt;from read_kushimoto_uragami import read_kushimoto_uragami&lt;br /&gt;&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;import numpy as np&lt;br /&gt;&lt;br /&gt;#read data&lt;br /&gt;kuroshio_lat=read_kuroshio_lat()&lt;br /&gt;kushimoto_uragami=read_kushimoto_uragami()&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;#plot&lt;br /&gt;plt.figure()&lt;br /&gt;plt.plot(kushimoto_uragami,kuroshio_lat,'.')&lt;br /&gt;plt.xlabel("Kushimoto-Uragami")&lt;br /&gt;plt.ylabel("Kuroshio Latitude")&lt;br /&gt;plt.savefig("kurosho_corr.png")&lt;br /&gt;plt.show()&lt;/blockquote&gt;潮位差が大きいと、黒潮の緯度は高くなる（岸に近い流路をとる）傾向があることがわかる。&lt;br /&gt;相関をとってみよう。&lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #eeeeee;"&gt;c1=&lt;a href="http://www.scipy.org/Numpy_Example_List_With_Doc?highlight=%28corrcoef%29#head-f08a3e6b178e230a18c172bbbe4c755f799a803f"&gt;np.corrcoef&lt;/a&gt;([kushimoto_uragami,kuroshio_lat])&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;print c1&lt;/span&gt;&amp;nbsp; &lt;br /&gt;[[ 1.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.11969213]&lt;br /&gt;&amp;nbsp;[ 0.11969213&amp;nbsp; 1.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ]]&lt;/blockquote&gt;相関係数は 0.11969213　!?&amp;nbsp;&amp;nbsp; 小さ！！！&lt;br /&gt;&lt;br /&gt;numpyの&lt;a href="http://docs.scipy.org/doc/numpy/reference/maskedarray.html"&gt;masked array&lt;/a&gt;でマスクした潮位差の欠損値のところでうまく計算できていないらしい。ちゃんと欠損値を抜いて計算してみよう。&lt;br /&gt;&lt;blockquote style="background-color: #eeeeee;"&gt;mask=(kushimoto_uragami.mask==False)&lt;br /&gt;c2=np.corrcoef([kushimoto_uragami[mask],kuroshio_lat[mask]])&lt;br /&gt;print c2&lt;span style="background-color: #eeeeee;"&gt;&lt;/span&gt; &lt;span style="background-color: white;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;[[ 1.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.61846868]&lt;br /&gt;&amp;nbsp;[ 0.61846868&amp;nbsp; 1.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ]]&lt;/blockquote&gt;今度はそれなりの相関係数 0.61846868 が出た。&lt;br /&gt;&lt;br /&gt;実は初めからmasked array用の相関係数の関数&lt;a href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.ma.corrcoef.html#numpy.ma.corrcoef"&gt;ma.corrcoef&lt;/a&gt;を使えば、そのままでも計算できる。&lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #eeeeee;"&gt;c3=np.&lt;a href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.ma.corrcoef.html#numpy.ma.corrcoef"&gt;ma.corrcoef&lt;/a&gt;([kushimoto_uragami,kuroshio_lat])&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;print c3&lt;/span&gt; &lt;/blockquote&gt;&lt;blockquote&gt;[[1.0 0.61846868176]&lt;br /&gt;&amp;nbsp;[0.61846868176 1.0]]&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-7579383433422448054?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/7579383433422448054/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=7579383433422448054' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7579383433422448054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7579383433422448054'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/02/read-module-from-readkuroshiolat-import.html' title='串本と浦神の潮位差と黒潮流路位置の相関'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_DVivl99_vFE/S3LBojr7A5I/AAAAAAAAAh8/7Is5Pk0zpqI/s72-c/kurosho_corr.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-7518422167736408738</id><published>2010-02-09T22:32:00.002+09:00</published><updated>2010-05-26T23:41:40.323+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data'/><title type='text'>串本と浦神の潮位差</title><content type='html'>&lt;br /&gt;&lt;br /&gt;串本と浦神の潮位差は黒潮の流路と密接な関係があることが知られている（&lt;a href="http://www.data.kishou.go.jp/kaiyou/db/kaikyo/knowledge/kuroshio.html#sealevel"&gt;参考:気象庁&lt;/a&gt;）。串本と浦神の潮位差の月平均値のデータは気象庁から手に入れることができる。&lt;a href="http://www.data.kishou.go.jp/kaiyou/shindan/b_2/kuroshio_stream/ksur.txt"&gt;http://www.data.kishou.go.jp/kaiyou/shindan/b_2/kuroshio_stream/ksur.txt&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;以下はそれを読むプログラム。基本的には&lt;a href="http://oceansciencehack.blogspot.com/2010/02/blog-post_1073.html"&gt;前回&lt;/a&gt;と同じだが、欠損値があるので一手間が必要。 &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DVivl99_vFE/S3FjNo3HX_I/AAAAAAAAAh0/CmEClAonsaQ/s1600-h/kushimoto_uragami.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_DVivl99_vFE/S3FjNo3HX_I/AAAAAAAAAh0/CmEClAonsaQ/s320/kushimoto_uragami.png" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;read_kushimoto_uragami.py&lt;br /&gt;&lt;pre class="prettyprint"&gt;import numpy as np&lt;br /&gt;import scikits.timeseries as ts&lt;br /&gt;&lt;br /&gt;def read_kushimoto_uragami():&lt;br /&gt;    day=[]&lt;br /&gt;    value=[]&lt;br /&gt;    ds = np.DataSource(None)&lt;br /&gt;    f=ds.open('http://www.data.kishou.go.jp/kaiyou/shindan/b_2/kuroshio_stream/ksur.txt')&lt;br /&gt;    for line in f:&lt;br /&gt;         fields = line.strip().split()&lt;br /&gt;         if len(fields)&amp;gt;=1: day.append(fields[0])&lt;br /&gt;         if len(fields)==1:&lt;br /&gt;             value.append(-999.)&lt;br /&gt;         elif len(fields)==2:&lt;br /&gt;             value.append(fields[1])&lt;br /&gt;    f.close()&lt;br /&gt;    valuea=np.asarray(value,dtype='float32')&lt;br /&gt;    kushimoto_uragami=ts.time_series(valuea,start_date=day[0],freq='M',mask=(valuea&amp;lt;-990.))&lt;br /&gt;    return kushimoto_uragami&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;    import matplotlib.pyplot as plt&lt;br /&gt;    import scikits.timeseries.lib.plotlib as tpl&lt;br /&gt;&lt;br /&gt;    kushimoto_uragami=read_kushimoto_uragami()&lt;br /&gt;&lt;br /&gt;    fig = tpl.tsfigure()&lt;br /&gt;    fsp = fig.add_tsplot(111)&lt;br /&gt;    fsp.tsplot(kushimoto_uragami, '-')&lt;br /&gt;    plt.xlabel("YEAR")&lt;br /&gt;    plt.ylabel("Kushimoto-Uragami (cm)")&lt;br /&gt;    plt.savefig("kushimoto_uragami.png")&lt;br /&gt;    plt.show()&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-7518422167736408738?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/7518422167736408738/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=7518422167736408738' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7518422167736408738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7518422167736408738'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/02/blog-post_09.html' title='串本と浦神の潮位差'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_DVivl99_vFE/S3FjNo3HX_I/AAAAAAAAAh0/CmEClAonsaQ/s72-c/kushimoto_uragami.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-4377659322777302067</id><published>2010-02-08T23:00:00.002+09:00</published><updated>2010-05-26T23:40:53.465+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data'/><title type='text'>黒潮の流路変化</title><content type='html'>*&lt;br /&gt;*&lt;br /&gt;&lt;blockquote&gt;&lt;div style="background-color: #fce5cd;"&gt;&lt;b&gt;初ガツオ：水揚げ　勝浦漁港、活気づく　／千葉&lt;/b&gt;&lt;/div&gt;&lt;div style="background-color: #fce5cd;"&gt;勝浦市の勝浦漁港に２５日、初ガツオが水揚げされた。江戸中期の俳人・山口素堂が「目には青葉山ほととぎす初鰹」と詠む通り、黒潮に乗って日本列島に近づく初ガツオの本格シーズンは５月ごろ。冬の終わりを予感させる水揚げに、漁港は活気づいた。&lt;/div&gt;&lt;span style="background-color: #fce5cd;"&gt;（&lt;/span&gt;&lt;a href="http://mainichi.jp/area/chiba/news/20100126ddlk12020161000c.html" style="background-color: #fce5cd;"&gt;毎日新聞 2010/1/25&lt;/a&gt;&lt;span style="background-color: #fce5cd;"&gt;）&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;黒潮の流れは、日本南岸を岸に近づいたり、離れたりして流れる。&lt;br /&gt;参考：&lt;a href="http://www.data.kishou.go.jp/kaiyou/shindan/b_2/kuroshio_stream/kuroshio_stream.html"&gt; 黒潮の数か月から十年規模の変動（流路）　気象庁&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;黒潮の流軸の緯度のデータは上の気象庁のサイトから&lt;a href="http://www.data.kishou.go.jp/kaiyou/shindan/b_2/kuroshio_stream/kuro_slat.txt"&gt;入手できる&lt;/a&gt;。 &lt;br /&gt;&lt;br /&gt;以下はそのデータを読取りプロットするpythonプログラム。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_DVivl99_vFE/S3AZK0fYtbI/AAAAAAAAAhs/aTp0rsvG4t4/s1600-h/kurosho_lat.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_DVivl99_vFE/S3AZK0fYtbI/AAAAAAAAAhs/aTp0rsvG4t4/s320/kurosho_lat.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;blockquote style="background-color: #eeeeee;"&gt;import numpy as np&lt;br /&gt;import &lt;a href="http://pytseries.sourceforge.net/"&gt;scikits.timeseries&lt;/a&gt; as ts&lt;br /&gt;&lt;br /&gt;def read_kuroshio_lat():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ds = &lt;a href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.DataSource.html#numpy.DataSource"&gt;np.DataSource&lt;/a&gt;(None)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; f=ds.open('http://www.data.kishou.go.jp/kaiyou/shindan/b_2/kuroshio_stream/kuro_slat.txt')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; data=&lt;a href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html#numpy.genfromtxt"&gt;np.genfromtxt&lt;/a&gt;(f,dtype=[('date','S7'),('lat','f4')])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; f.close()&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp; ds.__del__&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; kuroshio_lat=ts.time_series(data['lat'],start_date=data['date'][0],freq='M')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return kuroshio_lat&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; import matplotlib.pyplot as plt&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; import scikits.timeseries.lib.plotlib as tpl&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; kuroshio_lat=read_kuroshio_lat()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fig = tpl.tsfigure()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fsp = fig.add_tsplot(111)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fsp.tsplot(kuroshio_lat, '-')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; plt.xlabel("YEAR")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; plt.ylabel("Kurosho latitude")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; plt.savefig("kurosho_lat.png")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; plt.show()&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-4377659322777302067?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/4377659322777302067/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=4377659322777302067' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/4377659322777302067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/4377659322777302067'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/02/blog-post_1073.html' title='黒潮の流路変化'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_DVivl99_vFE/S3AZK0fYtbI/AAAAAAAAAhs/aTp0rsvG4t4/s72-c/kurosho_lat.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-7008661627815785464</id><published>2010-02-08T12:05:00.001+09:00</published><updated>2010-02-08T12:32:16.202+09:00</updated><title type='text'>北極振動時の日本付近の冬の気圧パターン</title><content type='html'>*&lt;br /&gt;*&lt;br /&gt;12月の1000hpaのgeopotentail heightに&lt;a href="http://oceansciencehack.blogspot.com/2010/02/blog-post.html"&gt;前にもとめた北極振動のパターン&lt;/a&gt;を重ねてみる。北極振動指数が正だと西高東低が弱まり、負だと強まる。&lt;br /&gt;&lt;br /&gt;北極振動指数0の時&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_DVivl99_vFE/S29-oA1gheI/AAAAAAAAAhU/l4BaKKqABJE/s1600-h/AO_patter_0.0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_DVivl99_vFE/S29-oA1gheI/AAAAAAAAAhU/l4BaKKqABJE/s320/AO_patter_0.0.png" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;北極振動+2の時&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_DVivl99_vFE/S29-y-0mCoI/AAAAAAAAAhc/ET5X7n5Wa2o/s1600-h/AO_patter_2.0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_DVivl99_vFE/S29-y-0mCoI/AAAAAAAAAhc/ET5X7n5Wa2o/s320/AO_patter_2.0.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;nbsp;北極振動-2の時&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://3.bp.blogspot.com/_DVivl99_vFE/S29_GT_0FXI/AAAAAAAAAhk/BWVaBjsZ6uY/s1600-h/AO_patter_-2.0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_DVivl99_vFE/S29_GT_0FXI/AAAAAAAAAhk/BWVaBjsZ6uY/s320/AO_patter_-2.0.png" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;以下、プログラム&lt;/div&gt;&lt;blockquote style="background-color: #eeeeee;"&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;from mpl_toolkits.basemap import Basemap&amp;nbsp; # for Basemap toolkit&lt;/div&gt;import matplotlib.pyplot as plt&lt;br /&gt;import numpy as np&lt;br /&gt;&lt;br /&gt;lat=np.load('lat.npy')&amp;nbsp; # latitude &lt;br /&gt;lon=np.load('lon.npy')&amp;nbsp; # longitude&lt;br /&gt;lat[-1]=lat[-1]-1.E-4&amp;nbsp; # lat=90 does not work&lt;br /&gt;&lt;br /&gt;#average field&lt;br /&gt;mhgt=np.load('mhgt.npy') # seasonal climatology&lt;br /&gt;dec_average=mhgt[11,:,:] # december&lt;br /&gt;&lt;br /&gt;#AO pattern&lt;br /&gt;factor = np.sqrt(np.cos(np.pi*lat/180.))&lt;br /&gt;eof1=np.load('eof1.npy')&lt;br /&gt;AO_pattern=eof1/factor[:,np.newaxis]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------- plot geopotential height (AO index 0, 2,-2)&lt;br /&gt;for index in [0.,2.,-2.]:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; data=dec_average+AO_pattern*index&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fig=plt.figure()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ax = fig.add_axes([0.1,0.1,0.8,0.8])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; map = Basemap(width=15.e6,height=12.e6,\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; projection='gnom',lat_0=60.,lon_0=135.)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; map.drawcoastlines()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; lons,lats=np.meshgrid(lon[:],lat[:])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; x,y=map(lons,lats)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cy=map.contourf(x,y,data,np.arange(-100,300,20),extend='both')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cz=map.contour(x,y,data,np.arange(-100,300,20),colors='k')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; plt.clabel(cz,fmt='%3.0f',)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; plt.savefig('AO_patter_'+str(index)+'.png')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; plt.show()&lt;/blockquote&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-7008661627815785464?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/7008661627815785464/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=7008661627815785464' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7008661627815785464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7008661627815785464'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/02/blog-post_08.html' title='北極振動時の日本付近の冬の気圧パターン'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_DVivl99_vFE/S29-oA1gheI/AAAAAAAAAhU/l4BaKKqABJE/s72-c/AO_patter_0.0.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-5844536669811987382</id><published>2010-02-07T16:23:00.000+09:00</published><updated>2010-02-07T16:23:23.719+09:00</updated><title type='text'>北極振動指数の時系列　2/2</title><content type='html'>*&lt;br /&gt;*&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/02/12.html"&gt;前回&lt;/a&gt;はEOFと同時に得られる時系列をプロットした。今回はEOFの期間外の北極振動指数を求めてプロットする。例えば2008年から2009年までの値を求めてプロットすると次のとおり。赤が自分で求めた値で、黒が&lt;a href="http://www.cpc.ncep.noaa.gov/products/precip/CWlink/daily_ao_index/monthly.ao.index.b50.current.ascii"&gt;NOAAの発表している値&lt;/a&gt;。ほとんどあっている。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_DVivl99_vFE/S25luy0oP1I/AAAAAAAAAhM/C1iPdZ46SvY/s1600-h/check_AOindex-2008-2009.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_DVivl99_vFE/S25luy0oP1I/AAAAAAAAAhM/C1iPdZ46SvY/s320/check_AOindex-2008-2009.png" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;以下がプログラム。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;(1) &lt;a href="https://sites.google.com/site/drtorumiyama/python/python-interface-to-grads"&gt;python interface for grads&lt;/a&gt; を使い、2008年から2009年の1000hpaのgeopotential heightを読み込む。データソースはNCEP/NCAR reanalysis。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;(2) &lt;a href="http://oceansciencehack.blogspot.com/2010/02/blog-post.html"&gt;EOFを求めるときにセーブしておいた&lt;/a&gt;、12ヶ月分の1979-2000年気候値(mhgt)を読み込んで、差し引く。mhgtは&lt;a href="http://www.scipy.org/Numpy_Example_List_With_Doc#tile"&gt;numpyのtile関数&lt;/a&gt;を用いて時間方向に2回(2年分)の繰り返しにする。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;(3)　緯度のファクターを掛ける。緯度90度の取扱いは&lt;a href="http://oceansciencehack.blogspot.com/2010/02/blog-post.html"&gt;EOFを求める時とおなじよう&lt;/a&gt;にしておく。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;(4)&lt;a href="http://oceansciencehack.blogspot.com/2010/02/blog-post.html"&gt;EOFを求めるときにセーブしておいたEOF1のパターン&lt;/a&gt;にプロジェクションをおこなう。また、北極振動を規格化するための定数pfactor1で、EOFを規格化するのと、時系列を規格化するので2回割る。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;nbsp;&lt;/div&gt;&lt;blockquote style="background-color: #eeeeee;"&gt;from grads.ganum import GaNum&amp;nbsp; # for python interface for grads&lt;br /&gt;&lt;br /&gt;from mpl_toolkits.basemap import Basemap&amp;nbsp; # for Basemap toolkit&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;import numpy as np&lt;br /&gt;&lt;br /&gt;import scikits.timeseries as ts&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #scikits timeseries module&lt;br /&gt;import scikits.timeseries.lib.plotlib as tpl&lt;br /&gt;&lt;br /&gt;#------------&amp;nbsp; data import using python interface for grads　(1)&lt;br /&gt;&lt;br /&gt;ga = GaNum(Bin='grads') &lt;br /&gt;fh=ga.open("http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis.derived/pressure/hgt.mon.mean.nc") # data open&lt;br /&gt;#fh=ga.open("/home/tmiyama/DATA/Reanalysis/NCEP1/hgt.mon.mean.nc") # data open&lt;br /&gt;ga("set lat 20 90")&lt;br /&gt;ga("set time&amp;nbsp; JAN2008 DEC2009") # use data from 2008 to 2009 &lt;br /&gt;ga("set lev 1000") # 1000 hpa &lt;br /&gt;hgt = ga.exp("hgt")&lt;br /&gt;del ga&lt;br /&gt;&lt;br /&gt;#------------- Get AO index&amp;nbsp; ---------------------------- &lt;br /&gt;&lt;br /&gt;#remove seasonal climatogical (2)&lt;br /&gt;mhgt=np.load('mhgt.npy')&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;hgt=hgt-np.tile(mhgt,(2,1,1))&lt;br /&gt;&lt;br /&gt;# multiply latitude factor　(3)　 &lt;br /&gt;lat=hgt.grid.lat &lt;br /&gt;lat[-1]=lat[-1]+1.E4 &lt;br /&gt;factor = np.sqrt(np.cos(np.pi*(lat/180.)))&lt;br /&gt;datain = hgt[:,:,:] * factor[np.newaxis,:,np.newaxis]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# projection to EOF1 (4)&lt;br /&gt;nt,ny,nx=datain.shape&lt;br /&gt;eof1=np.load('eof1.npy')&lt;br /&gt;pc1=np.dot(np.reshape(datain.data,(nt,ny*nx)),np.reshape(eof1,(ny*nx,1)))&lt;br /&gt;pfactor1=np.load('pfactor1.npy')&lt;br /&gt;pc1=pc1/pfactor1/pfactor1&lt;br /&gt;&lt;br /&gt;dbeginmonth=ts.Date('M', '2008-1')&lt;br /&gt;AO_2008_2009_series=ts.time_series(pc1,start_date=dbeginmonth,freq='M') # make timeseries object&lt;br /&gt;&lt;br /&gt;# plot &lt;br /&gt;from readAO import readAO&lt;br /&gt;AOindex_series=readAO() # import NOAA data &lt;br /&gt;&lt;br /&gt;fig = tpl.tsfigure()&lt;br /&gt;fsp = fig.add_tsplot(111)&lt;br /&gt;l1=fsp.tsplot(AOindex_series, 'k-')&lt;br /&gt;l2=fsp.tsplot(AO_2008_2009_series, 'r-')&lt;br /&gt;istart=ts.Date('M','2008-1').value&lt;br /&gt;iend=ts.Date('M','2009-12').value&lt;br /&gt;fsp.set_xlim(istart,iend)&lt;br /&gt;plt.xlabel("YEAR")&lt;br /&gt;plt.ylabel("AO index")&lt;br /&gt;plt.legend((l1,l2),("NOAA","What I got"))&lt;br /&gt;plt.savefig("check_AOindex-2008-2009.png")&lt;br /&gt;plt.show()&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-5844536669811987382?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/5844536669811987382/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=5844536669811987382' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/5844536669811987382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/5844536669811987382'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/02/22.html' title='北極振動指数の時系列　2/2'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_DVivl99_vFE/S25luy0oP1I/AAAAAAAAAhM/C1iPdZ46SvY/s72-c/check_AOindex-2008-2009.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-3632961655565095318</id><published>2010-02-04T23:31:00.000+09:00</published><updated>2010-02-04T23:31:36.295+09:00</updated><title type='text'>北極振動指数の時系列　1/2</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;*&lt;br /&gt;*&lt;br /&gt;前回の続き。&lt;a href="http://oceansciencehack.blogspot.com/2010/02/blog-post.html"&gt;前回もとめた&lt;/a&gt;first EOFの時系列が、N&lt;a href="http://www.cpc.ncep.noaa.gov/products/precip/CWlink/daily_ao_index/monthly.ao.index.b50.current.ascii"&gt;OAA CPCの発表している北極振動の値&lt;/a&gt;と一致しているか確かめる。黒がNOAAのCPCの値で、赤が自分でもとめたもの。&lt;br /&gt;ちょっとだけ値がずれているが、ほとんどあっているのでいいんじゃないかな。前回よくわからなかった北極のとりあつかいとかがずれる原因かもしれない。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DVivl99_vFE/S2qR30YZniI/AAAAAAAAAhE/QRHUYPXR9XM/s1600-h/check_AOindex.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_DVivl99_vFE/S2qR30YZniI/AAAAAAAAAhE/QRHUYPXR9XM/s320/check_AOindex.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;以下がプログラム。&lt;a href="http://oceansciencehack.blogspot.com/2010/01/blog-post.html"&gt;以前作ったreadAOモジュール&lt;/a&gt;でNOAA CPCの北極振動を読む。時系列オブジェクトを作るのと、プロットには&lt;a href="http://pytseries.sourceforge.net/"&gt;scikits.timeseries&lt;/a&gt;を用いた。 &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #eeeeee;"&gt;# plot pc1&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;import scikits.timeseries as ts&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;import scikits.timeseries.lib.plotlib as tpl&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;dbeginmonth=ts.Date('M', '1979-1')&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;pc1_series=ts.time_series(pc1,start_date=dbeginmonth,freq='M')&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;from readAO import readAO&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;AOindex_series=readAO()&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;fig = tpl.tsfigure()&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;fsp = fig.add_tsplot(111)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;l1=fsp.tsplot(AOindex_series, 'k-')&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;l2=fsp.tsplot(pc1_series, 'r-')&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;istart=ts.Date('M','1979-1').value&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;iend=ts.Date('M','2000-12').value&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;fsp.set_xlim(istart,iend)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;plt.xlabel("YEAR")&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;plt.ylabel("AO index")&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;plt.legend((l1,l2),("NOAA","What I got"))&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;plt.savefig("check_AOindex.png")&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;plt.show()&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-3632961655565095318?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/3632961655565095318/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=3632961655565095318' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/3632961655565095318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/3632961655565095318'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/02/12.html' title='北極振動指数の時系列　1/2'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_DVivl99_vFE/S2qR30YZniI/AAAAAAAAAhE/QRHUYPXR9XM/s72-c/check_AOindex.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-7833231764583688615</id><published>2010-02-04T00:03:00.004+09:00</published><updated>2010-09-26T18:10:09.224+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data'/><title type='text'>北極振動　パターン</title><content type='html'>*&lt;br /&gt;*&lt;br /&gt;NOAA Climate Prediction Centerの記述　&lt;a href="http://www.cpc.ncep.noaa.gov/products/precip/CWlink/daily_ao_index/history/method.shtml"&gt;http://www.cpc.ncep.noaa.gov/products/precip/CWlink/daily_ao_index/history/method.shtml&lt;/a&gt;　を参考にEOF解析を用いて北極振動のパターンをもとめる。&lt;br /&gt;&lt;br /&gt;用いる”python interface for grads”には&lt;a href="http://opengrads.org/doc/python/grads/grads.ganum.html#GaNum-eof"&gt;EOF関数&lt;/a&gt;があるのだが、計算がうまくいかなかったので(緯度が90度の点があるとうまくいかないようだ）、自分でつぎのようなモジュールを作っておく。&lt;br /&gt;”python interface for grads”から&lt;br /&gt;&lt;blockquote style="background-color: #eeeeee;"&gt;from grads.ganum import GaNum &lt;br /&gt;ga = GaNum(Bin='grads')&lt;br /&gt;ga.eof??&lt;/blockquote&gt;で関数の中身がわかるのでそれを参考に作る。&lt;br /&gt;eof.py&lt;br /&gt;&lt;blockquote style="background-color: #eeeeee;"&gt;def eof (data):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; calculates Empirical &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Orthogonal Functions (EOFS) using Singular Value Decomposition (SVD). &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; V, d, c = eof(data)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; V&amp;nbsp; ---&amp;nbsp; eigenvectors&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d&amp;nbsp; ---&amp;nbsp; NumPy array with eigenvalues&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c&amp;nbsp; ---&amp;nbsp; NumPy array with principal components&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; import numpy as np&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; At least 2 time steps&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ---------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if data.shape[0] &amp;lt; 2:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; raise GrADSError, \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'need at least 2 time steps for EOFS but got nt=%d'% data.shap&lt;br /&gt;e[0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; nt, ny, nx = (data.shape[0],&amp;nbsp; data.shape[1], data.shape[2])&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Export N-dimensional array&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; u = data&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Reshape as 3D&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; u = u.reshape(nt,ny,nx)&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pc, d, u = np.linalg.svd(u.reshape(nt,ny*nx),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; full_matrices=0)&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Eigenvalues/coefficients&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; d = d * d &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pc =&amp;nbsp; pc.transpose()&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Reshape eigenvectors as original array&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; u = u.reshape(nt,ny,nx)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (u, d, pc)&lt;/blockquote&gt;モジュールが準備できたら、EOF解析を実行する。&lt;br /&gt;使用するモジュールをインポートする。最後に、上のeofモジュールをインポートしている。&lt;br /&gt;&lt;blockquote style="background-color: #eeeeee;"&gt;from grads.ganum import GaNum&amp;nbsp; # for python interface for grads&lt;br /&gt;&lt;br /&gt;from mpl_toolkits.basemap import Basemap&amp;nbsp; # for Basemap toolkit&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;import numpy as np&lt;br /&gt;&lt;br /&gt;from eof import eof # import EOF&lt;/blockquote&gt;python interface for gradsを用いて、1971年か2000までのデータを読み込む。データはOPeNDAPを用いてNCEP/NCARのデータを&lt;a href="http://www.esrl.noaa.gov/psd/data/gridded/using_dods.html"&gt;NOAA ESRL&lt;/a&gt;のサイトから読み込んでいる。あるいはローカルにnetcdfを落としておいてそこから読んでも良い。1000hpaのGeopotential Heightを用いる。&lt;a href="http://www.atmos.umd.edu/%7Ebguan/grads/GrADS_Scripts.html"&gt;Bin GuanさんのGradsスクリプト&lt;/a&gt;を用いて季節変動(mhgt)を引いて、アノマリ（ahgt)だけを取り出す。&lt;br /&gt;&lt;blockquote style="background-color: #eeeeee;"&gt;#------------&amp;nbsp; data import using python interface for grads&lt;br /&gt;&lt;br /&gt;ga = GaNum(Bin='grads')&lt;br /&gt;fh=ga.open("http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis.derived/pressure/hgt.mon.mean.nc") # data open&lt;br /&gt;#fh=ga.open("hgt.mon.mean.nc") # data open&lt;br /&gt;ga("set lat 20 90")&lt;br /&gt;ga("set time&amp;nbsp; JAN1979 DEC2000") # use data from 1979 to 2000 &lt;br /&gt;ga("set lev 1000") # 1000 hpa&lt;br /&gt;ga("deseason hgt ahgt mhgt JAN1979 DEC2000") #use "deseason" at http://www.atmos.umd.edu/~bguan/grads/GrADS_Scripts.html agt is anomaly &lt;br /&gt;ahgt = ga.exp("ahgt")&lt;br /&gt;mhgt = ga.exp("mhgt")&lt;br /&gt;del ga&lt;/blockquote&gt;EOF解析をおこなう。cos（緯度)^0.5のファクターをかけるのであるが、緯度90度の部分があると、svdがもとまらなかった。どうするのが正しいかよく分からないが、ちょっとだけ緯度をずらしてみた。北極振動指数は、1979年から2000年までの時系列の分散が1になるように設定されているので、そのように規格化する。また通常の定義にあうように符号も逆転させておく。&lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #eeeeee;"&gt;#------------- EOF ---------------------------- &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;lat=ahgt.grid.lat&amp;nbsp; # latitude &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;lon=ahgt.grid.lon&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;lat[-1]=lat[-1]-1.E-4&amp;nbsp; # lat=90 does not work&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;factor = np.sqrt(np.cos(np.pi*lat/180.))&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;datain = ahgt[:,:,:] * factor[np.newaxis,:,np.newaxis]&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;v,d,c=eof(datain)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;pc1=c[0,:]*np.sqrt(d[0])&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;pfactor1=pc1.std(axis=0)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;pc1=-pc1/pfactor1&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;eof1=-v[0,:]*pfactor1&lt;/span&gt;&lt;br /&gt;&lt;div style="background-color: #eeeeee;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;あとはプロット。cos（緯度)^0.5ももとに戻しておく。後で使うかもしれないのでデータも保存しておく。&lt;br /&gt;&lt;blockquote style="background-color: #eeeeee;"&gt;#------------- plot loading pattern&lt;br /&gt;fig=plt.figure()&lt;br /&gt;ax = fig.add_axes([0.1,0.1,0.8,0.8])&lt;br /&gt;map = Basemap(projection='nplaea',boundinglat=20,lon_0=0.,resolution='i')&lt;br /&gt;map.drawcoastlines()&lt;br /&gt;&lt;br /&gt;lons,lats=np.meshgrid(lon[:],lat[:]+1.E-4)&lt;br /&gt;x,y=map(lons,lats)&lt;br /&gt;cz=map.contourf(x,y,eof1/factor[:,np.newaxis],[-40,-35,-30,-25,-20,-15,-10,-5,5,10,15,20],extend='both',cmap=plt.cm.RdBu_r)&lt;br /&gt;&lt;br /&gt;# get axes position, add colorbar axes to right of this.&lt;br /&gt;pos = ax.get_position()&lt;br /&gt;l, b, w, h = pos.bounds&lt;br /&gt;cax = plt.axes([l+w+0.05, b, 0.03, h]) # setup colorbar axes.&lt;br /&gt;plt.colorbar(cax=cax) # draw colorbar&lt;br /&gt;plt.savefig("AO_loading.png")&lt;br /&gt;plt.show()&lt;br /&gt;&lt;br /&gt;# save data for later use&lt;br /&gt;np.save('eof1.npy', eof1.data)&lt;br /&gt;np.save('pc1.npy', pc1.data)&lt;br /&gt;np.save('mhgt.npy',mhgt[0:12,:,:].data)&lt;br /&gt;np.save('pfactor1.npy',pfactor1)&lt;br /&gt;np.save('lon.npy',lon)&lt;br /&gt;np.save('lat.npy',lat)&lt;/blockquote&gt;&lt;br /&gt;できたプロット。&lt;a href="http://www.cpc.ncep.noaa.gov/products/precip/CWlink/daily_ao_index/ao.loading.shtml"&gt;NOAAのサイトにあるパターン&lt;/a&gt;と似たパターンを得ることができた。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_DVivl99_vFE/S2mN0q4BUNI/AAAAAAAAAg8/6GnfvevGpx8/s1600-h/AO_loading.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_DVivl99_vFE/S2mN0q4BUNI/AAAAAAAAAg8/6GnfvevGpx8/s320/AO_loading.png" /&gt;&lt;/a&gt;&lt;/div&gt;このパターン（EOF第一モード）が説明する割合は19%。&lt;br /&gt;&lt;blockquote style="background-color: #eeeeee;"&gt;d[0]/d.sum(axis=0)&lt;/blockquote&gt;&lt;blockquote&gt;0.19079784&lt;/blockquote&gt;&lt;br /&gt;2010/2/7 追記&lt;br /&gt;緯度90度でうまく計算できないのは、計算精度により、cos90度　が負になり、その平方根をとっているからのようである。&lt;br /&gt;2010/2/7 訂正&lt;br /&gt;pfactor1はmasked arrayではないので、&lt;span style="background-color: #eeeeee;"&gt;np.save('pfactor1.npy',pfactor1.data)&lt;span style="background-color: white;"&gt;から&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: #eeeeee;"&gt;np.save('pfactor1.npy',pfactor1)&lt;span style="background-color: white;"&gt;に修正。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;&lt;span style="background-color: white;"&gt;2010/2/8 追記&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;&lt;span style="background-color: white;"&gt;緯度(lat)、経度(lon)も保存するようにした。&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;np.save('lon.npy',lon)&lt;/span&gt;&lt;br style="background-color: #eeeeee;" /&gt;&lt;span style="background-color: #eeeeee;"&gt;np.save('lat.npy',lat)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-7833231764583688615?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/7833231764583688615/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=7833231764583688615' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7833231764583688615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7833231764583688615'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/02/blog-post.html' title='北極振動　パターン'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_DVivl99_vFE/S2mN0q4BUNI/AAAAAAAAAg8/6GnfvevGpx8/s72-c/AO_loading.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-1052923765879220081</id><published>2010-01-28T22:07:00.000+09:00</published><updated>2010-01-28T22:07:48.008+09:00</updated><title type='text'>Scientific Peer Review, ca. 1945</title><content type='html'>&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/-VRBWLpYCPY&amp;amp;hl=ja_JP&amp;amp;fs=1&amp;amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/-VRBWLpYCPY&amp;amp;hl=ja_JP&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-1052923765879220081?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/1052923765879220081/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=1052923765879220081' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/1052923765879220081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/1052923765879220081'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/01/scientific-peer-review-ca-1945.html' title='Scientific Peer Review, ca. 1945'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-615087620988150312</id><published>2010-01-28T17:20:00.005+09:00</published><updated>2010-01-28T22:26:25.615+09:00</updated><title type='text'>いろいろな気候インデックスとの相関</title><content type='html'>*&lt;br /&gt;*&lt;br /&gt;NOAA　ESRLの &lt;br /&gt;Linear Correlations in Atmospheric Seasonal/Monthly Averages&lt;br /&gt;&lt;a href="http://www.esrl.noaa.gov/psd/data/correlation/"&gt;http://www.esrl.noaa.gov/psd/data/correlation/&lt;/a&gt;というページで各種気候インデックスといろいろな物理量の相関がプロットできる。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;NINO3.4と表面温度の相関　(12月から2月）&lt;br /&gt;日本は暖冬傾向だが、北日本でははっきりしない。&lt;br /&gt;参考：&lt;a href="http://www.data.jma.go.jp/gmd/cpd/data/elnino/learning/tenkou/nihon1.html"&gt;気象庁&lt;/a&gt; &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DVivl99_vFE/S2FIdSQQHhI/AAAAAAAAAgM/T0A_-4jbIrc/s1600-h/ENSO.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_DVivl99_vFE/S2FIdSQQHhI/AAAAAAAAAgM/T0A_-4jbIrc/s320/ENSO.gif" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;北極振動と表面温度の相関　(12月から2月）&lt;br /&gt;日本は正の相関である。つまり北極振動が負だと寒冬の傾向がある。&lt;br /&gt;参考：&lt;a href="http://www.data.kishou.go.jp/climate/cpdinfo/climate_change/2005/1.7.2.html"&gt;気象庁&lt;/a&gt; &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DVivl99_vFE/S2FIn6KODxI/AAAAAAAAAgU/mhfcc-m35Fs/s1600-h/AO_cor.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_DVivl99_vFE/S2FIn6KODxI/AAAAAAAAAgU/mhfcc-m35Fs/s320/AO_cor.gif" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-615087620988150312?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/615087620988150312/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=615087620988150312' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/615087620988150312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/615087620988150312'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/01/blog-post_28.html' title='いろいろな気候インデックスとの相関'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_DVivl99_vFE/S2FIdSQQHhI/AAAAAAAAAgM/T0A_-4jbIrc/s72-c/ENSO.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-1209315237103970524</id><published>2010-01-24T00:07:00.001+09:00</published><updated>2010-01-28T17:46:38.311+09:00</updated><title type='text'>北極振動　気圧場</title><content type='html'>*&lt;br /&gt;*&lt;br /&gt;2008年と2009年の気圧場（1000hpa &lt;a href="http://ja.wikipedia.org/wiki/%E3%82%B8%E3%82%AA%E3%83%9D%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A3%E3%83%AB"&gt;Geopotential height&lt;/a&gt;）を比較する。&lt;br /&gt;2009年は&lt;a href="http://www.cpc.ncep.noaa.gov/products/precip/CWlink/daily_ao_index/ao.loading.shtml"&gt;北極振動のパターン&lt;/a&gt;と逆の符号（負のフェーズ）の傾向が強い。 &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_DVivl99_vFE/S1sNYl6qoPI/AAAAAAAAAf8/WfRiw_fYhbY/s1600-h/gpt_2008.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="301" src="http://2.bp.blogspot.com/_DVivl99_vFE/S1sNYl6qoPI/AAAAAAAAAf8/WfRiw_fYhbY/s400/gpt_2008.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_DVivl99_vFE/S1sNfDNqskI/AAAAAAAAAgE/5qj7kLUAWTQ/s1600-h/gpt_2009.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="301" src="http://4.bp.blogspot.com/_DVivl99_vFE/S1sNfDNqskI/AAAAAAAAAgE/5qj7kLUAWTQ/s400/gpt_2009.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;以下プログラム。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://opengrads.org/wiki/index.php?title=Python_Interface_to_GrADS"&gt;python interface for grads&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://matplotlib.sourceforge.net/"&gt;matplotlib&lt;/a&gt;&lt;/li&gt;&lt;li&gt;numpy&lt;/li&gt;&lt;li&gt;&lt;a href="http://matplotlib.sourceforge.net/basemap/doc/html/"&gt;basmap toolkit&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;を使用。 &lt;br /&gt;データは&lt;a href="http://www.esrl.noaa.gov/psd/data/gridded/using_dods.html"&gt;Opendap&lt;/a&gt;とい仕組みでNOAAからNCEP/NCARのデータを取得&lt;br /&gt;&lt;blockquote style="background-color: #eeeeee;"&gt;from grads.ganum import GaNum&amp;nbsp; # for python interface for grads&lt;br /&gt;&lt;br /&gt;from mpl_toolkits.basemap import Basemap&amp;nbsp; # for Basemap toolkit&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;import numpy as np&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;for nyear in [2008,2009]:&lt;br /&gt;# data import using python interface for grads&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ga = &lt;a href="http://opengrads.org/doc/python/grads/grads.ganum.html"&gt;GaNum&lt;/a&gt;(Bin='grads')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fh=ga.open("http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis.derived/pressure/hgt.mon.mean.nc") # data open&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ga("set time dec%(nyear)s" % locals())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ga("set lat 0 90")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ga("q file")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ga("set lev 1000") # 1000 hpa&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hgt=ga.exp("hgt")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; del ga&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; lat=hgt.grid.lat&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; lon=hgt.grid.lon&lt;br /&gt;&lt;br /&gt;# map&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fig=plt.figure()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ax = fig.add_axes([0.1,0.1,0.8,0.8])&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; map = &lt;a href="http://matplotlib.sourceforge.net/basemap/doc/html/users/plaea.html"&gt;Basemap(projection='nplaea',boundinglat=10,lon_0=135,resolution='i')&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; map.drawcoastlines()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; map.drawmapboundary()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; lons,lats=np.meshgrid(lon[:],lat[:])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; x,y=map(lons,lats)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; map.fillcontinents()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cz=map.contour(x,y,hgt[:,:],np.arange(-100,300,20))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; plt.clabel(cz,fmt="%3.0f")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; plt.title("Geopotential height (m): Dec %(nyear)s " % locals())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; plt.savefig("gpt_%(nyear)s.png" % locals())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; plt.show()&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-1209315237103970524?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/1209315237103970524/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=1209315237103970524' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/1209315237103970524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/1209315237103970524'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/01/blog-post_24.html' title='北極振動　気圧場'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_DVivl99_vFE/S1sNYl6qoPI/AAAAAAAAAf8/WfRiw_fYhbY/s72-c/gpt_2008.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-7745839616099918962</id><published>2010-01-23T01:30:00.009+09:00</published><updated>2010-05-14T16:08:17.996+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>北極振動　Rで統計　グラフ編</title><content type='html'>**&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/01/r.html"&gt;前回&lt;/a&gt;の続き&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="background-color: #f4cccc;"&gt;#boxplot&lt;br /&gt;scripts="""&lt;br /&gt;png(’boxplot.png’)&lt;br /&gt;boxplot(rdatain)&lt;br /&gt;dev.off()&lt;br /&gt;""" &lt;br /&gt;r(scripts)&lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_DVivl99_vFE/S1nPv9ac33I/AAAAAAAAAfc/xvIkxc5oNbU/s1600-h/boxplot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_DVivl99_vFE/S1nPv9ac33I/AAAAAAAAAfc/xvIkxc5oNbU/s320/boxplot.png" /&gt;&lt;/a&gt;&lt;/div&gt;去年の12月の値は「外れ値」にはなっていない&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="background-color: #f4cccc;"&gt;#hist&lt;br /&gt;scripts="""&lt;br /&gt;png('hist.png')&lt;br /&gt;hist(rdatain,seq(-4, 4, 0.4),prob=TRUE)&lt;br /&gt;x&amp;lt;-seq(-4, 4, 0.2)&lt;br /&gt;lines(x, dnorm(x, mean=mean(rdatain), sd=sqrt(var(rdatain))), lty=3)&lt;br /&gt;dev.off()&lt;br /&gt;"""&lt;br /&gt;a=r(scripts)&lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DVivl99_vFE/S1nQ0oajzuI/AAAAAAAAAfk/oRGY1ljhMWM/s1600-h/hist.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_DVivl99_vFE/S1nQ0oajzuI/AAAAAAAAAfk/oRGY1ljhMWM/s320/hist.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;span style="background-color: #f4cccc;"&gt;#cdf plot&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #f4cccc;"&gt;scripts="""&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #f4cccc;"&gt;png('cdf.png')&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #f4cccc;"&gt;plot(ecdf(rdatain), do.points=FALSE, verticals=TRUE)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #f4cccc;"&gt;x&amp;lt;-seq(-4, 4, 0.01)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #f4cccc;"&gt;lines(x, pnorm(x, mean=mean(rdatain), sd=sqrt(var(rdatain))), lty=3)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #f4cccc;"&gt;dev.off()&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #f4cccc;"&gt;"""&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #f4cccc;"&gt;r(scripts)&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DVivl99_vFE/S1nQ66a-gkI/AAAAAAAAAfs/hzAqvFES6wI/s1600-h/cdf.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_DVivl99_vFE/S1nQ66a-gkI/AAAAAAAAAfs/hzAqvFES6wI/s320/cdf.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;blockquote style="background-color: #f4cccc;"&gt;#qqplot&lt;br /&gt;scripts="""&lt;br /&gt;png('qqplot.png')&lt;br /&gt;qqnorm(rdatain)&lt;br /&gt;qqline(rdatain)&lt;br /&gt;dev.off()&lt;br /&gt;"""&lt;br /&gt;r(scripts)&lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_DVivl99_vFE/S1nRD9WVydI/AAAAAAAAAf0/GrexTvKnqic/s1600-h/qqplot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_DVivl99_vFE/S1nRD9WVydI/AAAAAAAAAf0/GrexTvKnqic/s320/qqplot.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;正規分布より分布がせまい。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-7745839616099918962?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/7745839616099918962/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=7745839616099918962' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7745839616099918962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7745839616099918962'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/01/r_23.html' title='北極振動　Rで統計　グラフ編'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_DVivl99_vFE/S1nPv9ac33I/AAAAAAAAAfc/xvIkxc5oNbU/s72-c/boxplot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-4893191478797784494</id><published>2010-01-21T13:24:00.008+09:00</published><updated>2010-05-14T16:04:35.817+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>北極振動　Rで統計</title><content type='html'>&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/01/12.html" style="font-family: inherit;"&gt;北極振動　12月だけを抜き出し&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;の続き&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt; 12月のデータだけ抜き出して、Rで統計処理する。 &lt;/span&gt;&lt;a href="http://rpy.sourceforge.net/rpy2.html" style="font-family: inherit;"&gt;Rpy2&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;を使う。&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt; まずは以下のように準備。&lt;/span&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/01/blog-post.html" style="font-family: inherit;"&gt;readAO&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;と&lt;/span&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/01/12.html" style="font-family: inherit;"&gt;pickup_month&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;は以前作ったもの。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: inherit;"&gt;AO_rpy2.py&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;blockquote style="background-color: #eeeeee;"&gt;&lt;span style="font-size: small;"&gt;from readAO import readAO # read AO data&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;from pick_month import pick_month # pick month&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;#&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;import scikits.timeseries as ts&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;#&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;import rpy2.robjects as robjects&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;# read AO data&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;AOindex_series=readAO()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;# pickup December &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;AOindex_dec=pick_month(AOindex_series,month=12)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;#remove missig value&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;data=AOindex_dec[AOindex_dec.mask==False].data&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;# for R&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;rdata=robjects.FloatVector(data)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;robjects.globalEnv["rdatain"] = rdata&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;r=robjects.r&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;それで、&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: #eeeeee; font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;a=r('summary(rdatain)')&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;または&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: #eeeeee; font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;a=r.summary(rdata)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;または&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: #eeeeee; font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;summary=r['summary']&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;a=summary(rdata)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;いずれも同じ結果&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: #eeeeee;"&gt;print a&lt;/span&gt;&lt;br /&gt;Min.  1st Qu.   Median     Mean  3rd Qu.     Max. &lt;br /&gt;-3.41300 -1.24200 -0.08762 -0.19740  0.82490  2.28200 &lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;print a[0]&lt;/span&gt;&lt;br /&gt;-3.413&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;print a.names&lt;/span&gt;&lt;br /&gt;[1] "Min."    "1st Qu." "Median"  "Mean"    "3rd Qu." "Max."  &lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;b=a.r["Mean"]&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;print b&lt;/span&gt;&lt;br /&gt;Mean &lt;br /&gt;-0.1974 &lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;b[0]&lt;/span&gt;&lt;br /&gt;-0.19739999999999999&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #eeeeee;"&gt;print a.subset(1)&lt;/span&gt;&lt;br /&gt;Min. &lt;br /&gt;-3.413 &lt;br /&gt;&lt;br /&gt;参考&lt;br /&gt;Rで統計: データ集合中の最大、最小、平均、中央値 - summary()関数&lt;a href="http://www.yukun.info/blog/2008/09/r-summary-mean-median.html"&gt;http://www.yukun.info/blog/2008/09/r-summary-mean-median.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-4893191478797784494?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/4893191478797784494/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=4893191478797784494' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/4893191478797784494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/4893191478797784494'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/01/r.html' title='北極振動　Rで統計'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-7334150287877547233</id><published>2010-01-19T22:39:00.001+09:00</published><updated>2010-01-19T22:42:26.040+09:00</updated><title type='text'>北極振動　12月だけを抜き出し</title><content type='html'>続き&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/01/blog-post.html"&gt;北極振動&lt;/a&gt;&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/01/blog-post_13.html"&gt;北極振動　年平均&amp;nbsp;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/01/ao.html"&gt;AO 各年ごとにプロット　および　気候学平均&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;北極振動の時系列から12月だけを抜き出す。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_DVivl99_vFE/S1W1asnJxhI/AAAAAAAAAfU/RLdJGKqbfM8/s1600-h/AOindex_dec.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_DVivl99_vFE/S1W1asnJxhI/AAAAAAAAAfU/RLdJGKqbfM8/s320/AOindex_dec.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;以下、プログラム。&lt;br /&gt;pick_month.py&lt;br /&gt;&lt;blockquote style="background-color: #f4cccc;"&gt;from readAO import readAO&lt;br /&gt;#&lt;br /&gt;import numpy as np&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;import scikits.timeseries as ts&lt;br /&gt;import scikits.timeseries.lib.plotlib as tpl&lt;br /&gt;&lt;br /&gt;&lt;b&gt;def pick_month(series,month):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """ pick time series only month==month&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mask=(series.dates.month==month)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; out=series[mask].asfreq("A")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return out&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AOindex_series=readAO()&lt;br /&gt;&lt;br /&gt;# pickup December &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;AOindex_dec=pick_month(AOindex_series,month=12)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;#plot&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fig = tpl.tsfigure()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fsp = fig.add_tsplot(111)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fsp.tsplot(AOindex_dec, 'r-')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; plt.xlabel("YEAR")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; plt.ylabel("AO index")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; plt.savefig("AOindex_dec.png")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; plt.show()&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-7334150287877547233?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/7334150287877547233/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=7334150287877547233' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7334150287877547233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/7334150287877547233'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/01/12.html' title='北極振動　12月だけを抜き出し'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_DVivl99_vFE/S1W1asnJxhI/AAAAAAAAAfU/RLdJGKqbfM8/s72-c/AOindex_dec.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-6408040213054292684</id><published>2010-01-19T00:39:00.002+09:00</published><updated>2010-01-19T00:54:55.910+09:00</updated><title type='text'>AO 各年ごとにプロット　および　気候学平均</title><content type='html'>続き&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/01/blog-post.html"&gt;北極振動&lt;/a&gt;&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/01/blog-post_13.html"&gt;北極振動　年平均&amp;nbsp;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;AOを各年毎にプロット（黒線）&lt;br /&gt;2009年だけ赤線&lt;br /&gt;気候学的平均（各月ごと、青線）&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_DVivl99_vFE/S1SBZwu8hZI/AAAAAAAAAfM/Ar06K6PCnFQ/s1600-h/AO_season.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_DVivl99_vFE/S1SBZwu8hZI/AAAAAAAAAfM/Ar06K6PCnFQ/s320/AO_season.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;2009年の12月は異常に値が小さかったことがわかる。&lt;br /&gt;&lt;br /&gt;以下プログラム。&lt;br /&gt;&lt;blockquote style="background-color: #f4cccc;"&gt;plot_AO_season.py &lt;br /&gt;from readAO import readAO&lt;br /&gt;#&lt;br /&gt;import numpy as np&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;import scikits.timeseries as ts&lt;br /&gt;import scikits.timeseries.lib.plotlib as tpl&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;AOindex_series=readAO()&lt;br /&gt;# to seasonal&lt;br /&gt;AOindex_season=ts.extras.convert_to_annual(AOindex_series)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#plot each year&lt;br /&gt;fig = tpl.tsfigure()&lt;br /&gt;fsp = fig.add_tsplot(111)&lt;br /&gt;&lt;br /&gt;for n in range(AOindex_season.shape[0]):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; series = ts.time_series(AOindex_season[n,:], start_date=ts.Date(freq="m",year=1990,month=1),length=12)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; lstyle='k-'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if AOindex_season.dates.year[n] == 2009:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lstyle='r-'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fsp.tsplot(series, lstyle)&lt;br /&gt;&lt;br /&gt;# climatological average&lt;br /&gt;&lt;br /&gt;AOindex_average = ts.time_series(np.mean(AOindex_season,axis=0), start_date=ts.Date(freq="m",year=1990,month=1),length=12)&lt;br /&gt;fsp.tsplot(AOindex_average, 'b-',linewidth=2)&lt;br /&gt;fsp.xaxis.set_ticklabels(["Jan"]) # dirty trick for plot&lt;br /&gt;plt.savefig("AO_season.png")&lt;br /&gt;plt.show()&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-6408040213054292684?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/6408040213054292684/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=6408040213054292684' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/6408040213054292684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/6408040213054292684'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/01/ao.html' title='AO 各年ごとにプロット　および　気候学平均'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_DVivl99_vFE/S1SBZwu8hZI/AAAAAAAAAfM/Ar06K6PCnFQ/s72-c/AO_season.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-4074058909294531953</id><published>2010-01-18T22:00:00.054+09:00</published><updated>2010-09-18T00:26:44.511+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sage'/><title type='text'>Sageで数学　素数</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sagemath.org/"&gt;Sage&lt;/a&gt;で素数を遊んでみる。&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #f4cccc;"&gt;sage: A=&lt;a href="http://www.sagemath.org.nyud.net/doc/reference/sage/sets/primes.html"&gt;Primes&lt;/a&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #f4cccc;"&gt;sage: A.first() &lt;/span&gt;&lt;br /&gt;2&lt;br /&gt;&lt;span style="background-color: #f4cccc;"&gt;sage: A.next(2)&lt;/span&gt;&lt;br /&gt;3&lt;br /&gt;&lt;span style="background-color: #f4cccc;"&gt;sage: A.next(3)&lt;/span&gt;&lt;br /&gt;5&lt;br /&gt;&lt;span style="background-color: #f4cccc;"&gt;sage: A.next(5)&lt;/span&gt;&lt;br /&gt;7&lt;br /&gt;&lt;span style="background-color: #f4cccc;"&gt;sage: A.next(4)&lt;/span&gt;&lt;br /&gt;5&lt;br /&gt;&lt;span style="background-color: #f4cccc;"&gt;sage: A.unrank(0)&lt;/span&gt;&lt;br /&gt;2&lt;br /&gt;&lt;span style="background-color: #f4cccc;"&gt;sage: A.unrank(4)　&lt;/span&gt;#Returns the 4-th prime number.&lt;br /&gt;11&lt;br /&gt;&lt;div style="background-color: #f4cccc;"&gt;sage: A.unrank(100)&lt;/div&gt;547&lt;br /&gt;&lt;span style="background-color: #f4cccc;"&gt;sage: 17 in A&lt;/span&gt;&lt;br /&gt;True&lt;br /&gt;&lt;span style="background-color: #f4cccc;"&gt;sage: A.cardinality() # Counts the elements of the enumerated set.&lt;/span&gt;&lt;br /&gt;+Infinity&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #f4cccc;"&gt;sage: &lt;a href="http://www.sagemath.org.nyud.net/doc/reference/sage/functions/prime_pi.html"&gt;prime_pi&lt;/a&gt;(548)&amp;nbsp;&lt;/span&gt;# Return the number of primes &amp;lt;=549&lt;br /&gt;101&lt;br /&gt;&lt;span style="background-color: #f4cccc;"&gt;sage: plot(prime_pi,1,600)&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DVivl99_vFE/S1RbViH89JI/AAAAAAAAAfE/lpOQteWa1T8/s1600-h/primes.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_DVivl99_vFE/S1RbViH89JI/AAAAAAAAAfE/lpOQteWa1T8/s320/primes.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;2010/9/17 追記　&lt;b style="color: red;"&gt;素数定理&lt;/b&gt;&lt;br /&gt;x 以下の素数の数（下、赤線）は&lt;br /&gt;&lt;img align="middle" border="0" src="http://www.codecogs.com/gif.latex?$Li%28x%29=%5Cint_%7B2%7D%5E%7Bx%7D%5Cfrac%7Bdt%7D%7B%5Cln%20t%7D" /&gt;&lt;br /&gt;（緑線）に近い。&lt;br /&gt;あるいは、その近似である&lt;br /&gt;&lt;img align="middle" border="0" src="http://www.codecogs.com/gif.latex?%5Cfrac%7Bx%7D%7B%5Cln%20x%7D" /&gt;&lt;br /&gt;（青線）に近い。&lt;br /&gt;&lt;pre class="prettyprint"&gt;a=plot(prime_pi,2,10000,color="red")&lt;br /&gt;b=plot(Li,2,10000,color="green")&lt;br /&gt;c=plot(x/ln(x),2,10000,color="blue")&lt;br /&gt;a+b+c&lt;br /&gt;&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_DVivl99_vFE/TJOHOK7GHPI/AAAAAAAAAmo/4FCYAtVnqyw/s1600/PNtheorem.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_DVivl99_vFE/TJOHOK7GHPI/AAAAAAAAAmo/4FCYAtVnqyw/s320/PNtheorem.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;参考: &lt;a href="http://ja.wikipedia.org/wiki/%E7%B4%A0%E6%95%B0%E5%AE%9A%E7%90%86"&gt;Wikipedia 素数定理 &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;算数の冒険(川端裕人 著）&lt;br /&gt;&lt;iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=climatechange-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as1&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;md=1X69VDGQCMF7Z30FM082&amp;amp;asins=440853563X" style="height: 240px; width: 120px;"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-4074058909294531953?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/4074058909294531953/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=4074058909294531953' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/4074058909294531953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/4074058909294531953'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/01/sage.html' title='Sageで数学　素数'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_DVivl99_vFE/S1RbViH89JI/AAAAAAAAAfE/lpOQteWa1T8/s72-c/primes.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-970397209986342738</id><published>2010-01-13T11:35:00.000+09:00</published><updated>2010-01-13T11:35:04.814+09:00</updated><title type='text'>北極振動　年平均</title><content type='html'>続き&lt;br /&gt;&lt;a href="http://oceansciencehack.blogspot.com/2010/01/blog-post.html"&gt;北極振動&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;年平均をつくる。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_DVivl99_vFE/S00vt60gfOI/AAAAAAAAAe8/wVHgivPnAPc/s1600-h/AOindex_anu.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_DVivl99_vFE/S00vt60gfOI/AAAAAAAAAe8/wVHgivPnAPc/s320/AOindex_anu.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;前回のreadAO.pyを用いる。&lt;br /&gt;&lt;blockquote style="background-color: #f4cccc;"&gt;from readAO import readAO&lt;br /&gt;#&lt;br /&gt;import numpy as np&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;import scikits.timeseries as ts&lt;br /&gt;import scikits.timeseries.lib.plotlib as tpl&lt;br /&gt;&lt;br /&gt;AOindex_series=readAO()&lt;br /&gt;# to annual mean&lt;br /&gt;AOindex_annual=&lt;a href="http://pytseries.sourceforge.net/generated/scikits.timeseries.convert.html"&gt;ts.convert&lt;/a&gt;(AOindex_series,'A',func=np.ma.mean)&lt;br /&gt;&lt;br /&gt;#plot&lt;br /&gt;fig = tpl.tsfigure()&lt;br /&gt;fsp = fig.add_tsplot(111)&lt;br /&gt;fsp.tsplot(AOindex_annual, 'r-+')&lt;br /&gt;istart=fsp.get_xlim()[0]&lt;br /&gt;iend=ts.Date('A','2010').value&lt;br /&gt;fsp.set_xlim(istart,iend)&lt;br /&gt;plt.xlabel("YEAR")&lt;br /&gt;plt.ylabel("AO index")&lt;br /&gt;plt.savefig("AOindex_anu.png")&lt;br /&gt;plt.show()&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-970397209986342738?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/970397209986342738/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=970397209986342738' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/970397209986342738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/970397209986342738'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/01/blog-post_13.html' title='北極振動　年平均'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_DVivl99_vFE/S00vt60gfOI/AAAAAAAAAe8/wVHgivPnAPc/s72-c/AOindex_anu.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4918390655818864374.post-8177485985500436203</id><published>2010-01-12T16:02:00.004+09:00</published><updated>2010-05-26T23:39:50.834+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data'/><title type='text'>北極振動</title><content type='html'>最近、寒いのは北極振動が負になっているのが関係しているらしい。&lt;br /&gt;北極振動　wikipedia&lt;br /&gt;&lt;a href="http://ja.wikipedia.org/wiki/%E5%8C%97%E6%A5%B5%E6%8C%AF%E5%8B%95"&gt;http://ja.wikipedia.org/wiki/%E5%8C%97%E6%A5%B5%E6%8C%AF%E5%8B%95&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Arctic_oscillation"&gt;http://en.wikipedia.org/wiki/Arctic_oscillation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;AOのデータは以下から入手できる。&lt;br /&gt;&lt;a href="http://www.cpc.ncep.noaa.gov/products/precip/CWlink/daily_ao_index/ao.shtml"&gt;http://www.cpc.ncep.noaa.gov/products/precip/CWlink/daily_ao_index/ao.shtml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;プロットしてみる&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_DVivl99_vFE/S0wd9k7efdI/AAAAAAAAAe0/YwW3fgugaR4/s1600-h/AOindex.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_DVivl99_vFE/S0wd9k7efdI/AAAAAAAAAe0/YwW3fgugaR4/s320/AOindex.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;以下プログラム(python)。&lt;a href="http://pytseries.sourceforge.net/"&gt;scikits.timeseries&lt;/a&gt;を使っている。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;readAO.py &lt;/b&gt;&lt;/div&gt;&lt;blockquote style="background-color: #f4cccc;"&gt;def readAO():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "import monthly AO data"&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; import numpy as np&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; import scikits.timeseries as ts&lt;br /&gt;&lt;br /&gt;# data is downloaded from http://www.cpc.ncep.noaa.gov/products/precip/CWlink/daily_ao_index/monthly.ao.index.b50.current.ascii&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; f=open("monthly.ao.index.b50.current.ascii",'r')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; data=np.loadtxt(f)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; f.close()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AOindex=data[:,2]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; year=data[:,0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; month=data[:,1]&lt;br /&gt;&lt;br /&gt;# make time series&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tbeginmonth=str(int(year[0]))+"-"+str(int(month[0]))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbeginmonth=ts.Date('M', tbeginmonth)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AOindex_series=ts.time_series(AOindex,start_date=dbeginmonth,freq='M',mask=(AOindex&amp;lt;-99.))&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return AOindex_series&lt;br /&gt;##################################&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; import matplotlib.pyplot as plt&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; import scikits.timeseries as ts&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; import scikits.timeseries.lib.plotlib as tpl&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from datetime import datetime&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AOindex_series=readAO()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fig = tpl.tsfigure()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fsp = fig.add_tsplot(111)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fsp.tsplot(AOindex_series, '-')&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; istart=fsp.get_xlim()[0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; iend=ts.Date('M','2010-1').value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fsp.set_xlim(istart,iend)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; plt.xlabel("YEAR")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; plt.ylabel("AO index")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; plt.savefig("AOindex.png")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; plt.show()&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4918390655818864374-8177485985500436203?l=oceansciencehack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oceansciencehack.blogspot.com/feeds/8177485985500436203/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4918390655818864374&amp;postID=8177485985500436203' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/8177485985500436203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4918390655818864374/posts/default/8177485985500436203'/><link rel='alternate' type='text/html' href='http://oceansciencehack.blogspot.com/2010/01/blog-post.html' title='北極振動'/><author><name>Toru Miyama</name><uri>http://www.blogger.com/profile/11413252495514096849</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://1.bp.blogspot.com/_DVivl99_vFE/S51kmZq85nI/AAAAAAAAAjo/IL18naGnfhQ/S220/mypicture2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_DVivl99_vFE/S0wd9k7efdI/AAAAAAAAAe0/YwW3fgugaR4/s72-c/AOindex.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
