作者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://www.ptt.cc/bbs/R_Language/M.1526354622.A.065.html
推 AndrewShi: cywhale大~非常謝謝你,想請問你是把前4筆時間的溫度去 05/15 15:04
→ AndrewShi: 做平均再畫出圖的嗎?!可以請教你如果我想畫出前四筆時 05/15 15:04
→ AndrewShi: 間各別的溫度圖(4張圖)的話,時間的部分我該怎麼寫呢?? 05/15 15:04
→ AndrewShi: 謝謝~ 05/15 15:04
→ cywhale: 被我mark的就是時間 datex[i]就可以抓到你要的日期不是? 05/15 16:28
→ cywhale: 我順手做了一版data.table + ggplot.. 如果需要可以參考 05/15 16:30
推 AndrewShi: 了解~不過我在設定時間(寫迴圈)的時候,還是有出現erro 05/16 17:30
→ AndrewShi: r,不寫迴圈是可以畫出4張圖,但是我不知道怎麼在image 05/16 17:30
→ AndrewShi: 裡加上時間的指定,所以畫出來的4張圖感覺都是同一筆 05/16 17:30
→ AndrewShi: 資料,抱歉,cywhale大,我是因為研究需要用到R,所以 05/16 17:30
→ AndrewShi: 現在才開始學R(新手),以下是我修改的程式碼和出現的er 05/16 17:30
→ AndrewShi: ror,如果你有空也願意的話煩請你再幫我看看囉,謝謝你 05/16 17:30
→ AndrewShi: 真的幫助我很多(已跪XD 05/16 17:30
→ cywhale: 在R打? image可以看到此指令參數,並無mfrow,你還多傳 05/16 20:26
→ cywhale: 一個datex,你要給image哪個參數? datex若是vector 沒有 05/16 20:27
→ cywhale: datex["i"=1]這種寫法..你必須去看R基礎中關於vector取值 05/16 20:28
→ cywhale: 我寫的程式應該可以直接run 你可以把值print出來 datex和 05/16 20:29
→ cywhale: air[,,]第三個維度是相同size, 所以你要哪個日期,比如在 05/16 20:30
→ cywhale: datex[5]這個日期,取air[,,5]即是所有經緯度當次日期的 05/16 20:31
→ cywhale: 溫度值... 05/16 20:32
推 AndrewShi: cywhale大~像是改成這樣(到for迴圈結束)嗎?!不過我改 05/19 02:36
→ AndrewShi: 成這樣它畫出來的4張圖都是畫在同一個位置... 05/19 02:36
→ cywhale: 你單畫一張,不用取平均 air[,,i]取值即可 05/19 11:21
→ cywhale: 畫地圖的方式用你原來的即可 我只是用我慣用的 05/19 11:21
→ cywhale: 要給code時最好還是有文字連結 有很多免費資源可以貼code 05/19 11:22
→ cywhale: 只貼圖檔,只怕許多版上朋友看了也懶得重打難以測試 05/19 11:23
→ cywhale: 另外連結ggplot 也更新加上地圖 效果就跟你要的for-loop 05/19 11:36
→ cywhale: 一樣,不考慮跳ggplot嗎XD 05/19 11:37
推 AndrewShi: 了解~不過cywhale大,不取平均畫出來的全球溫度圖色調 05/19 19:11
→ AndrewShi: 都是一樣的,感覺怪怪的,那個mean(x-273)是指把第一 05/19 19:11
→ AndrewShi: 筆時間的溫度扣掉所有時間的平均還是指其他意思呢??另 05/19 19:11
→ AndrewShi: 外我只知道ggplot2是R裡面的一個繪圖套件,它跟R內建 05/19 19:11
→ AndrewShi: 的繪圖功能有什麼差別嗎 :)??謝謝~ 05/19 19:11
→ cywhale: 範例用i in 1:4 時間相近 畫出來當然都很像>< ..如果你 05/19 20:03
→ cywhale: 隨意找幾個時間點畫就不會像了比如i in c(1,101,224,455) 05/19 20:04
→ cywhale: nc檔給的是degree K 我改成degree C 所以-273不是? R是以 05/19 20:06
→ cywhale: 向量操作為思維,所以x是向量就會全減,你若懷疑就自己 05/19 20:07
→ cywhale: print值debug看看,就畫圖而言也不一定要減,配色是相對 05/19 20:08
→ cywhale: 值區段去配..ggplot2太多教學,我就不贅言,有興趣網路找 05/19 20:09
推 AndrewShi: cywhale大~我的意思是有加mean(x-273)時,畫出來的前四 05/19 23:04
→ AndrewShi: 筆時間的圖是有差別的,但如果把mean(x-273)去掉後,畫 05/19 23:04
→ AndrewShi: 出來的前四筆時間的圖色調都一樣(全球都單一色調),所 05/19 23:04
→ AndrewShi: 以我不太懂mean是做什麼的平均@@,以及不加mean全球的 05/19 23:04
→ AndrewShi: 溫度應該也不可能是單一溫度(色調),而至於ggplot2, 05/19 23:04
→ AndrewShi: 我不是伸手要教學,只是好奇一樣都是畫出一樣的圖但卻 05/19 23:04
→ AndrewShi: 要打更多的程式碼,是因為它的繪圖功能比較強大能把圖 05/19 23:04
→ AndrewShi: 畫的更精細嗎?!只是好奇它跟R內建的繪圖功能有什麼差別 05/19 23:04
→ AndrewShi: 而已~謝謝 05/19 23:04