作者cywhale (cywhale)
看板R_Language
标题Re: [问题] dimensions of z are not length(x)(-1)
时间Tue May 15 11:23:39 2018
#ncfile 读出是一个多维矩阵,你用temp[1:4]当然只会读出4笔 以下供参
#你可以针对每一次 (1:4)都画一次,在这里我不确定你要的操作,我取平均
#OB
library(ncdf4)
#library(magrittr)
#library(lubridate)
#library(units)
infile <- "D:/Env/air/air.2m.mon.mean.nc"
nx0 <- nc_open(infile)
print(nx0)
air <- ncvar_get(nx0, "air")
latx0<- ncvar_get(nx0, "lat")
lngx0<- ncvar_get(nx0, "lon")
#time<- ncvar_get(nx0, "time")
#tattr <- ncatt_get(nx0, "time") #get attributes
#units(time) <- make_unit(tattr$units)
#datex<- as.POSIXct(time) %>% as.Date(origin="1800-01-01 00:00") #:0.0")
#lvl <- ncvar_get(nx0, "level")
mair <- apply(air[,,1:4],c(1,2),function(x) mean(x-273.15, na.rm=T))
zt=matrix(mair,ncol=length(latx0),nrow=length(lngx0),byrow=F)
image(x=lngx0-180,y=rev(latx0),z=zt[,ncol(zt):1],
col = colorRamps::blue2red(128)) #rainbow(128)[50:128])
※ 引述《AndrewShi (没有你的我)》之铭言:
: ※ 引述《AndrewShi (没有你的我)》之铭言:
: : [问题类型]:
: : 程式谘询(我想用R 做某件事情,但是我不知道要怎麽用R 写出来)
: : [软体熟悉度]:
: : 入门(写过其他程式,只是对语法不熟悉)
: : [问题叙述]:
: : 这是一个全球温度的资料(nc档),时间总共有467笔,我想利用R画出前4笔的全球温度图
: : ,所以 写了一个简单的while回圈,但到了要image的时候就跑出了这个error,所以想请问大大
: : 们这个error是什麽意思,以及我该如何解决??谢谢~
: : [程式范例]:
: : https://i.imgur.com/JlqAFxw.jpg
: : https://i.imgur.com/fLzCmiC.jpg
: 以下为资料来源与程式码:
: 资料来源:
: https://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis2.pressure.html
: Air Temperature - Monthly Mean - 按图示 -->里面的最後一笔资料
: 程式码:
: rm(list=ls())
: library(ncdf4)
: air.nc<-nc_open("C:\\Users\\TOM\\Desktop\\R(资料库)\\air.2m.mon.mean.nc")
: air.nc
: "file C:\\Users\\TOM\\Desktop\\R(资料库)\\air.2m.mon.mean.nc has 5
: dimensions:"
: "lon Size:144"
: "lat Size:73"
: "level Size:17"
: "nbnds Size:2"
: "time Size:467"
: "file C:\\Users\\TOM\\Desktop\\R(资料库)\\air.2m.mon.mean.nc has 2 variables"
: "short air[lon,lat,level,time] Longname:Air temperature Missval:-32767"
: "short head[level,time] Longname:Missing Missval:NA"
: temp.nc<-nc_open("C:\\Users\\TOM\\Desktop\\R(资料库)\\air.2m.mon.mean.nc")
: temp<-ncvar_get(temp.nc,"air")
: temp[temp=="-32767"]<-NA
: temp.nc$dim$lon$vals -> lon
: temp.nc$dim$lat$vals -> lat
: temp.nc$dim$level$vals -> lev
: temp.nc$dim$nbnds$vals -> nbnds
: temp.nc$dim$time$vals -> time
: lat<-rev(lat)
: i<-1
: while(i<5){
: print(temp[i])
: i<-i+1
: }
: time="i"<-temp[i]
: lon<-lon-180
: temp<-(time="i")
: temp<-matrix(c("i"=1:4))
: image(lon,lat,matrix(temp,ncol=length(lat),nrow=length(lon),byrow=F))
: library(sp)
: library(maptools)
: gpclibPermit()
: data(wrld_simpl)
: plot(wrld_simpl,add=TRUE)
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.112.65.48
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1526354622.A.065.html
1F:推 AndrewShi: cywhale大~非常谢谢你,想请问你是把前4笔时间的温度去 05/15 15:04
2F:→ AndrewShi: 做平均再画出图的吗?!可以请教你如果我想画出前四笔时 05/15 15:04
3F:→ AndrewShi: 间各别的温度图(4张图)的话,时间的部分我该怎麽写呢?? 05/15 15:04
4F:→ AndrewShi: 谢谢~ 05/15 15:04
5F:→ cywhale: 被我mark的就是时间 datex[i]就可以抓到你要的日期不是? 05/15 16:28
6F:→ cywhale: 我顺手做了一版data.table + ggplot.. 如果需要可以参考 05/15 16:30
8F:推 AndrewShi: 了解~不过我在设定时间(写回圈)的时候,还是有出现erro 05/16 17:30
9F:→ AndrewShi: r,不写回圈是可以画出4张图,但是我不知道怎麽在image 05/16 17:30
10F:→ AndrewShi: 里加上时间的指定,所以画出来的4张图感觉都是同一笔 05/16 17:30
11F:→ AndrewShi: 资料,抱歉,cywhale大,我是因为研究需要用到R,所以 05/16 17:30
12F:→ AndrewShi: 现在才开始学R(新手),以下是我修改的程式码和出现的er 05/16 17:30
13F:→ AndrewShi: ror,如果你有空也愿意的话烦请你再帮我看看罗,谢谢你 05/16 17:30
14F:→ AndrewShi: 真的帮助我很多(已跪XD 05/16 17:30
17F:→ cywhale: 在R打? image可以看到此指令参数,并无mfrow,你还多传 05/16 20:26
18F:→ cywhale: 一个datex,你要给image哪个参数? datex若是vector 没有 05/16 20:27
19F:→ cywhale: datex["i"=1]这种写法..你必须去看R基础中关於vector取值 05/16 20:28
20F:→ cywhale: 我写的程式应该可以直接run 你可以把值print出来 datex和 05/16 20:29
21F:→ cywhale: air[,,]第三个维度是相同size, 所以你要哪个日期,比如在 05/16 20:30
22F:→ cywhale: datex[5]这个日期,取air[,,5]即是所有经纬度当次日期的 05/16 20:31
23F:→ cywhale: 温度值... 05/16 20:32
24F:推 AndrewShi: cywhale大~像是改成这样(到for回圈结束)吗?!不过我改 05/19 02:36
25F:→ AndrewShi: 成这样它画出来的4张图都是画在同一个位置... 05/19 02:36
28F:→ cywhale: 你单画一张,不用取平均 air[,,i]取值即可 05/19 11:21
29F:→ cywhale: 画地图的方式用你原来的即可 我只是用我惯用的 05/19 11:21
30F:→ cywhale: 要给code时最好还是有文字连结 有很多免费资源可以贴code 05/19 11:22
31F:→ cywhale: 只贴图档,只怕许多版上朋友看了也懒得重打难以测试 05/19 11:23
32F:→ cywhale: 另外连结ggplot 也更新加上地图 效果就跟你要的for-loop 05/19 11:36
33F:→ cywhale: 一样,不考虑跳ggplot吗XD 05/19 11:37
34F:推 AndrewShi: 了解~不过cywhale大,不取平均画出来的全球温度图色调 05/19 19:11
35F:→ AndrewShi: 都是一样的,感觉怪怪的,那个mean(x-273)是指把第一 05/19 19:11
36F:→ AndrewShi: 笔时间的温度扣掉所有时间的平均还是指其他意思呢??另 05/19 19:11
37F:→ AndrewShi: 外我只知道ggplot2是R里面的一个绘图套件,它跟R内建 05/19 19:11
38F:→ AndrewShi: 的绘图功能有什麽差别吗 :)??谢谢~ 05/19 19:11
39F:→ cywhale: 范例用i in 1:4 时间相近 画出来当然都很像>< ..如果你 05/19 20:03
40F:→ cywhale: 随意找几个时间点画就不会像了比如i in c(1,101,224,455) 05/19 20:04
41F:→ cywhale: nc档给的是degree K 我改成degree C 所以-273不是? R是以 05/19 20:06
42F:→ cywhale: 向量操作为思维,所以x是向量就会全减,你若怀疑就自己 05/19 20:07
43F:→ cywhale: print值debug看看,就画图而言也不一定要减,配色是相对 05/19 20:08
44F:→ cywhale: 值区段去配..ggplot2太多教学,我就不赘言,有兴趣网路找 05/19 20:09
45F:推 AndrewShi: cywhale大~我的意思是有加mean(x-273)时,画出来的前四 05/19 23:04
46F:→ AndrewShi: 笔时间的图是有差别的,但如果把mean(x-273)去掉後,画 05/19 23:04
47F:→ AndrewShi: 出来的前四笔时间的图色调都一样(全球都单一色调),所 05/19 23:04
48F:→ AndrewShi: 以我不太懂mean是做什麽的平均@@,以及不加mean全球的 05/19 23:04
49F:→ AndrewShi: 温度应该也不可能是单一温度(色调),而至於ggplot2, 05/19 23:04
50F:→ AndrewShi: 我不是伸手要教学,只是好奇一样都是画出一样的图但却 05/19 23:04
51F:→ AndrewShi: 要打更多的程式码,是因为它的绘图功能比较强大能把图 05/19 23:04
52F:→ AndrewShi: 画的更精细吗?!只是好奇它跟R内建的绘图功能有什麽差别 05/19 23:04
53F:→ AndrewShi: 而已~谢谢 05/19 23:04