Re: [問題] dimensions of z are not length(x)(-1)

看板R_Language作者 (cywhale)時間6年前 (2018/05/15 11:23), 編輯推噓6(6047)
留言53則, 2人參與, 6年前最新討論串3/3 (看更多)
#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

05/15 15:04, 6年前 , 1F
cywhale大~非常謝謝你,想請問你是把前4筆時間的溫度去
05/15 15:04, 1F

05/15 15:04, 6年前 , 2F
做平均再畫出圖的嗎?!可以請教你如果我想畫出前四筆時
05/15 15:04, 2F

05/15 15:04, 6年前 , 3F
間各別的溫度圖(4張圖)的話,時間的部分我該怎麼寫呢??
05/15 15:04, 3F

05/15 15:04, 6年前 , 4F
謝謝~
05/15 15:04, 4F

05/15 16:28, 6年前 , 5F
被我mark的就是時間 datex[i]就可以抓到你要的日期不是?
05/15 16:28, 5F

05/15 16:30, 6年前 , 6F
我順手做了一版data.table + ggplot.. 如果需要可以參考
05/15 16:30, 6F

05/15 16:31, 6年前 , 7F
05/15 16:31, 7F

05/16 17:30, 6年前 , 8F
了解~不過我在設定時間(寫迴圈)的時候,還是有出現erro
05/16 17:30, 8F

05/16 17:30, 6年前 , 9F
r,不寫迴圈是可以畫出4張圖,但是我不知道怎麼在image
05/16 17:30, 9F

05/16 17:30, 6年前 , 10F
裡加上時間的指定,所以畫出來的4張圖感覺都是同一筆
05/16 17:30, 10F

05/16 17:30, 6年前 , 11F
資料,抱歉,cywhale大,我是因為研究需要用到R,所以
05/16 17:30, 11F

05/16 17:30, 6年前 , 12F
現在才開始學R(新手),以下是我修改的程式碼和出現的er
05/16 17:30, 12F

05/16 17:30, 6年前 , 13F
ror,如果你有空也願意的話煩請你再幫我看看囉,謝謝你
05/16 17:30, 13F

05/16 17:30, 6年前 , 14F
真的幫助我很多(已跪XD
05/16 17:30, 14F

05/16 17:32, 6年前 , 15F

05/16 17:32, 6年前 , 16F

05/16 20:26, 6年前 , 17F
在R打? image可以看到此指令參數,並無mfrow,你還多傳
05/16 20:26, 17F

05/16 20:27, 6年前 , 18F
一個datex,你要給image哪個參數? datex若是vector 沒有
05/16 20:27, 18F

05/16 20:28, 6年前 , 19F
datex["i"=1]這種寫法..你必須去看R基礎中關於vector取值
05/16 20:28, 19F

05/16 20:29, 6年前 , 20F
我寫的程式應該可以直接run 你可以把值print出來 datex和
05/16 20:29, 20F

05/16 20:30, 6年前 , 21F
air[,,]第三個維度是相同size, 所以你要哪個日期,比如在
05/16 20:30, 21F

05/16 20:31, 6年前 , 22F
datex[5]這個日期,取air[,,5]即是所有經緯度當次日期的
05/16 20:31, 22F

05/16 20:32, 6年前 , 23F
溫度值...
05/16 20:32, 23F

05/19 02:36, 6年前 , 24F
cywhale大~像是改成這樣(到for迴圈結束)嗎?!不過我改
05/19 02:36, 24F

05/19 02:36, 6年前 , 25F
成這樣它畫出來的4張圖都是畫在同一個位置...
05/19 02:36, 25F

05/19 02:37, 6年前 , 26F

05/19 11:20, 6年前 , 27F
https://goo.gl/5jdY7t 最末更新 par設定畫布要在loop外
05/19 11:20, 27F

05/19 11:21, 6年前 , 28F
你單畫一張,不用取平均 air[,,i]取值即可
05/19 11:21, 28F

05/19 11:21, 6年前 , 29F
畫地圖的方式用你原來的即可 我只是用我慣用的
05/19 11:21, 29F

05/19 11:22, 6年前 , 30F
要給code時最好還是有文字連結 有很多免費資源可以貼code
05/19 11:22, 30F

05/19 11:23, 6年前 , 31F
只貼圖檔,只怕許多版上朋友看了也懶得重打難以測試
05/19 11:23, 31F

05/19 11:36, 6年前 , 32F
另外連結ggplot 也更新加上地圖 效果就跟你要的for-loop
05/19 11:36, 32F

05/19 11:37, 6年前 , 33F
一樣,不考慮跳ggplot嗎XD
05/19 11:37, 33F

05/19 19:11, 6年前 , 34F
了解~不過cywhale大,不取平均畫出來的全球溫度圖色調
05/19 19:11, 34F

05/19 19:11, 6年前 , 35F
都是一樣的,感覺怪怪的,那個mean(x-273)是指把第一
05/19 19:11, 35F

05/19 19:11, 6年前 , 36F
筆時間的溫度扣掉所有時間的平均還是指其他意思呢??另
05/19 19:11, 36F

05/19 19:11, 6年前 , 37F
外我只知道ggplot2是R裡面的一個繪圖套件,它跟R內建
05/19 19:11, 37F

05/19 19:11, 6年前 , 38F
的繪圖功能有什麼差別嗎 :)??謝謝~
05/19 19:11, 38F

05/19 20:03, 6年前 , 39F
範例用i in 1:4 時間相近 畫出來當然都很像>< ..如果你
05/19 20:03, 39F

05/19 20:04, 6年前 , 40F
隨意找幾個時間點畫就不會像了比如i in c(1,101,224,455)
05/19 20:04, 40F

05/19 20:06, 6年前 , 41F
nc檔給的是degree K 我改成degree C 所以-273不是? R是以
05/19 20:06, 41F

05/19 20:07, 6年前 , 42F
向量操作為思維,所以x是向量就會全減,你若懷疑就自己
05/19 20:07, 42F

05/19 20:08, 6年前 , 43F
print值debug看看,就畫圖而言也不一定要減,配色是相對
05/19 20:08, 43F

05/19 20:09, 6年前 , 44F
值區段去配..ggplot2太多教學,我就不贅言,有興趣網路找
05/19 20:09, 44F

05/19 23:04, 6年前 , 45F
cywhale大~我的意思是有加mean(x-273)時,畫出來的前四
05/19 23:04, 45F

05/19 23:04, 6年前 , 46F
筆時間的圖是有差別的,但如果把mean(x-273)去掉後,畫
05/19 23:04, 46F

05/19 23:04, 6年前 , 47F
出來的前四筆時間的圖色調都一樣(全球都單一色調),所
05/19 23:04, 47F

05/19 23:04, 6年前 , 48F
以我不太懂mean是做什麼的平均@@,以及不加mean全球的
05/19 23:04, 48F

05/19 23:04, 6年前 , 49F
溫度應該也不可能是單一溫度(色調),而至於ggplot2,
05/19 23:04, 49F

05/19 23:04, 6年前 , 50F
我不是伸手要教學,只是好奇一樣都是畫出一樣的圖但卻
05/19 23:04, 50F

05/19 23:04, 6年前 , 51F
要打更多的程式碼,是因為它的繪圖功能比較強大能把圖
05/19 23:04, 51F

05/19 23:04, 6年前 , 52F
畫的更精細嗎?!只是好奇它跟R內建的繪圖功能有什麼差別
05/19 23:04, 52F

05/19 23:04, 6年前 , 53F
而已~謝謝
05/19 23:04, 53F
文章代碼(AID): #1Q-bA-1b (R_Language)
文章代碼(AID): #1Q-bA-1b (R_Language)