请选择 进入手机版 | 继续访问电脑版
爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

新浪微博登陆

只需一步, 快速开始

QQ登录

只需一步,快速开始

搜索
查看: 759|回复: 10

[作图] 关于本科毕业论文的问题!急!可有偿!

[复制链接] |关注本帖

新浪微博达人勋

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
我的目的是出pdo指数。这是我查看的一篇文献给的的计算方法。
利用全球月平均海表温度资料,对北太平洋 20°~60° N、110° E~ 100° W 范围内求距平并进行 EOF分析,得到的第一时间序列即为 PDO 指数。(不过说的并不详细)

我手里的这份脚本也是对海温进行距平再做eof分析。不过他做的是大西洋nino。脚本如下

;load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/esmf/ESMF_regridding.ncl" ; 如需将台站资料插值至格点资料,则必须加载该ncl文件
load "$NCARG_ROOT/lib/ncarg/nclscripts/cnmap/cnmap.ncl"
load  "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
begin
neval=3
optEOF=True
optEOF@jopt=0
optETS = False
latS=-30.5
latN=30.5
lonL=-70.5
lonR=16.5
yrStrt = 1979
yrLast = 2014

;读取数据
f      = addfile ("/cygdrive/d/ex/data/HadISST_sst.nc", "r")

;选取1979-2014数据
TIME   = f->time
YYYY   = cd_calendar(TIME,-1)/100                 
iYYYY  = ind(YYYY.ge.yrStrt .and. YYYY.le.yrLast)
sst    = f->sst(iYYYY,{latS:latN},{lonL:lonR})
;printVarSummary(sst)
; sst   = lonFlip( sst )

;夏季距平
sst=where(sst.lt.0,sst@_FillValue,sst)
;sst1=dim_rmvmean_n_Wrap(sst,0)
SST1=month_to_season(dim_rmvmean_n_Wrap(sst,0),"JJA")
SST=dtrend_leftdim(SST1,False)            ;去除线性增长趋势

;权重
w=sqrt(cos(0.01745329*SST&latitude))
wp=SST*conform(SST,w,1)
copy_VarMeta(SST,wp)

data=wp({latitude|latS:latN},{longitude|lonL:lonR},time|:);调整维度

;EOF分析
ev1=eofunc_Wrap(data,neval,optEOF)
ts1=eofunc_ts_Wrap(data,ev1,optETS)
ev=10*ev1
ts=ts1/10
copy_VarMeta(ev1,ev)
copy_VarMeta(ts1,ts)

;空间数列
wks=gsn_open_wks("eps","Fig1a")
res=True
res@gsnAddCyclic         = False
res@cnFillOn=False
res@cnLinesOn=True
res@lbBoxLinesOn               = False  
res@cnSmoothingOn    = True
res@cnSmoothingDistanceF        = 0.005
res@gsnSpreadColors = True
res@mpMinLatF=latS
res@mpMaxLatF=latN
res@mpMinLonF            = lonL
res@mpMaxLonF            = lonR
res@cnLineLabelsOn=True
res@cnLineLabelPlacementMode="Constant"
res@cnLevelSelectionMode="ExplicitLevels"
res@cnLevels=(/-0.2,-0.1,0.0,0.1,0.2,0.3,0.4/)
;res@cnLineLabelDensityF=2
res@cnLineLabelInterval =1
res@cnInfoLabelOn=False
res@gsnContourNegLineDashPattern=16
res@gsnContourPosLineDashPattern=0
res@cnLineDashSegLenF          = 0.15
res@cnInfoLabelOn       = False                           ;去除右下角contour from to
res@cnLineLabelFontHeightF   =  0.01
res@cnLineLabelFormat   ="@*+^sg"                         ;数值形式 eg:0.1
res@pmTickMarkDisplayMode = "Always"
res@gsnLeftString  = "EOF "+(0+1)
res@gsnRightString = sprintf("%5.1f", ev@pcvar(1)) +"%"
symMinMaxPlt(ev, 16, False, res)
plot=gsn_csm_contour_map_ce(wks,smth9_Wrap(ev(1,:,:),0.5,0.25,False),res)
;时间序列
year=ispan(1979,2014,1)
wks_ts=gsn_open_wks("png","Fig1b")
rts           = True
rts@gsnScale  = True                  
rts@vpHeightF = 0.40        
rts@vpWidthF  = 0.85
rts@vpXF      = 0.10        
rts@vpYF      = 0.75        
rts@tiYAxisString = "~S~o~N~C"                       
rts@gsnYRefLine           = 0.               
rts@gsnXYBarChart         = True           
rts@gsnAboveYRefLineColor = "grey"           
rts@gsnBelowYRefLineColor = "grey"  
rts@gsnLeftString  = "EOF "+(0+1)
rts@gsnRightString = sprintf("%5.1f", ev@pcvar(1)) +"%"        
plot2=gsn_csm_xy(wks_ts,year,ts(1,:),rts)

;;;;;;;;;;;;;;;;;;;;;
;时间序列标准化
ts=dim_standardize_n_Wrap(ts,1,1)
;

end




然后我再讲一个我妄图改程序结果失败的故事。
这份脚本中距平部分做的是季节平均,只选择了一个季节,就相当与是做的年分析。曾经我想改这个程序,直接把他做季节距平的函数部分改成了做距平的函数。结果就由于改动后的距平是逐月的数据,而year是年的。所以

这一句当时就报错了。我的一次瞎改也失败了。
真的急啊!!!希望来个前辈帮帮我!可以有偿的!
微信:lrc756866304   qq756866304
希望有人愿意帮忙,资料我全都有!
密码修改失败请联系qq:937062711

新浪微博达人勋

发表于 2018-4-11 07:18:32 | 显示全部楼层 |取消关注该作者的回复
你要PDO指数是吧?网上有算好的啊。。
密码修改失败请联系qq:937062711

新浪微博达人勋

发表于 2018-4-11 07:19:09 | 显示全部楼层 |取消关注该作者的回复
密码修改失败请联系qq:937062711

新浪微博达人勋

 楼主| 发表于 2018-4-11 10:51:46 | 显示全部楼层 |取消关注该作者的回复
伽蓝鸟 发表于 2018-4-11 07:18
你要PDO指数是吧?网上有算好的啊。。

谢谢!但是我本科论文后续也需要再对这个程序做改动和其它的内容做相关。我本人也想知道这个程序到底怎么回事。。。。已经为了它忙活了一个多星期了。。有种执念。
密码修改失败请联系qq:937062711

新浪微博达人勋

发表于 2018-4-11 20:18:32 | 显示全部楼层 |取消关注该作者的回复
756866304 发表于 2018-4-11 10:51
谢谢!但是我本科论文后续也需要再对这个程序做改动和其它的内容做相关。我本人也想知道这个程序到底怎么 ...

啊好吧,抱歉我是用MATLAB的家伙。。我还以为是取得PDO指数之和去做后续分析呢,毕竟后续分析就够一篇毕业论文了吧。。
密码修改失败请联系qq:937062711

新浪微博达人勋

发表于 2018-4-12 08:45:09 | 显示全部楼层 |取消关注该作者的回复
SST1=month_to_season(dim_rmvmean_n_Wrap(sst,0),"JJA")
原程序中,是对sst(432,lat,lon)多年月数据针对JJA提取了夏季月平均资料并做了距平处理
你需要年平均资料并做距平处理?
SST1=month_to_annual(sst,1)   ;处理为多年平均资料SST1(36,lat,lon)
然后再做一个距平处理即可
密码修改失败请联系qq:937062711

新浪微博达人勋

 楼主| 发表于 2018-4-12 14:45:16 | 显示全部楼层 |取消关注该作者的回复
柚子皮 发表于 2018-4-12 08:45
SST1=month_to_season(dim_rmvmean_n_Wrap(sst,0),"JJA")
原程序中,是对sst(432,lat,lon)多年月数据针对J ...

谢谢!解决了!!
密码修改失败请联系qq:937062711

新浪微博达人勋

 楼主| 发表于 2018-4-12 14:45:40 | 显示全部楼层 |取消关注该作者的回复
伽蓝鸟 发表于 2018-4-11 20:18
啊好吧,抱歉我是用MATLAB的家伙。。我还以为是取得PDO指数之和去做后续分析呢,毕竟后续分析就够一篇毕 ...

谢谢啦,我题目已经定了所以没法子。。。
密码修改失败请联系qq:937062711

新浪微博达人勋

发表于 2018-4-12 17:52:24 | 显示全部楼层 |取消关注该作者的回复
有现成的fortran程序,楼主还需要的话可以给你
密码修改失败请联系qq:937062711

新浪微博达人勋

 楼主| 发表于 2018-4-12 20:19:30 | 显示全部楼层 |取消关注该作者的回复
islandowner 发表于 2018-4-12 17:52
有现成的fortran程序,楼主还需要的话可以给你

不用啦,谢谢,我用的ncl。问题已经解决啦!
密码修改失败请联系qq:937062711
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表