在推出兩期數據分享之后,獲取數據的小伙伴們也知道,數據格式都是NetCDF(nc) 格式網格數據,雖然我在推文分享中說明使用Python、R或者GIS類軟件都是可以進行 處理和可視化繪制的,但是,還是有小伙伴咨詢使用編程軟件Python或者R處理nc數據,正好也想分享一期關于nc網格數據的可視化繪制過程,這里我們使用R包進行nc數據的處理(Python處理較為簡單,將放在空間插值系列的資料中,該部分正在加快進程中哦~~),主要涉及的知識點如下:
-
nc數據文件的R包讀取
-
nc數據的可視化繪制
-
所有完整代碼都已整理之我們的線上課程,有需要的同學+v?yidianshuyulove?咨詢
nc數據文件的R包讀取
在R中讀取nc文件,我們首選ncdf4包,其使用參考網址如下: *https://rdrr.io/cran/ncdf4/*。這里簡單介紹下主要的函數:
-
print.ncdf4: Print Information About a netCDF File(輸出nc文件基本信息)。
-
nc_open(): Open a netCDF File(打開nc文件)。
-
ncvar_get(): Read data from a netCDF file(讀取nc文件中變量數據)。
-
ncatt_get(): Get attribute from netCDF file(獲取ncw文件屬性)。 對應nc文件,常用的使用方法就是以上4中,數據獲取后(由于是規整的數據格式)可以像其他數據一樣進行處理和變換。更多詳細內容可參考上面給出的網站。
nc數據的可視化繪制
由于我們使用的是ggplot2進行繪制,所以我們直接使用raster包進行nc文件的讀取(其實也是調用ncdf4包進行處理),數據我們就使用昨天分享數據的數據:數據(代碼)分享 | 全球生物氣候指標數據集。具體代碼如下:
library(raster)
library(sf)
library(tidyverse)
library(RColorBrewer)
library(ggtext)
library(showtext)
library(hrbrthemes)nc01?<-?"BIO34_CMCC_85_2040_79.nc"
dset01?<-?raster(nc01)
結果如下:
ggplot2可視化繪制
在使用ggplot2進行繪制之前,我們需要將raster包讀取的結果轉換成data.frame,方便繪圖:
dset01_df?<-?as.data.frame(dset01,xy?=?TRUE)
head(dset01_df)
可以看到數據還是有很多NA值的,這里我們選擇將NA值刪除,當然,你也可以不刪除處理,代碼如下(包含重命名):
dset01_df??<-??dplyr::rename(dset01_df,long?=?x,lat=y)
dset01_df_nona?<-?dset01_df?%>%?filter(!is.na(Potential.Evapotranspiration.Hargreaves))
結果如下:
接下來,我們就可以進行可視化設置了,這里直接給出繪圖代碼哈:
#自定義顏色
my_colormap?<-?colorRampPalette(rev(brewer.pal(11,'Spectral')))(32)
map?<-?ggplot()?+?geom_tile(data?=?dset01_df_nona,?aes(x=long,?y=lat,?fill=Potential.Evapotranspiration.Hargreaves))?+borders(colour?=?"black",alpha=.8,size=.1)?+#borders(colour?=?"black",fill="gray50",alpha=.4)?+scale_fill_gradientn(colours?=?my_colormap,name="PEH(mm)")?+labs(title?=?"Example?of?<span style='color:#D20F26'>BIO34?-?Potential?Evapotranspiration?(PET,?mm/y)</span>",subtitle?=?"processed?map?charts?with?<span style='color:#1A73E8'>geom_tile()</span>",caption?=?"Visualization?by?<span style='color:#DD6449'>DataCharm</span>")?+theme_ipsum(base_family?=?"Roboto?Condensed")?+theme(#plot.margin?=?grid::unit(c(0,0,0,0),?"mm"),?#去除圖片保存的留白問題plot.title?=?element_markdown(hjust?=?0.5,vjust?=?.5,color?=?"black",size?=?20,?margin?=?margin(t?=?1,?b?=?12)),plot.subtitle?=?element_markdown(hjust?=?0,vjust?=?.5,size=15),plot.caption?=?element_markdown(face?=?'bold',size?=?12),)
可視化結果如下:
當然我們也可以更換顏色條顏色,可視化效果如下:
此外,我們還可以設置不同投影的可視化繪制效果:結果如下:
注意:這里我們通過如下代碼設置了顏色柱(colorbar)的長寬等屬性:
legend.text?=?element_text(color?=?"black",size?=?11),
legend.key.width?=?unit(5.2,?"mm"),
legend.key.height?=?unit(12,?"mm")
倒是要想獲取數據資料分享中的可視化效果,我們需使用sf包對數據進行投影轉換及使用*geom_sf()*進行轉換結果的可視化繪制,代碼如下:
df_sf?<-?sf::st_as_sf(dset01_df,?coords?=?c("long",?"lat"),?crs?=?4326)?%>%sf::st_transform(crs?=?"+proj=robin")jet.colors?<-?colorRampPalette(c("#00007F",?"blue",?"#007FFF",?"cyan",?"#7FFF7F",?"yellow",?"#FF7F00",?"red",?"#7F0000"))ggplot()?+?#borders(colour?=?"black",fill="gray50",alpha=.5,)?+geom_sf(data?=?df_sf_nona,aes(color=Potential.Evapotranspiration.Hargreaves),size=.08)?+borders(colour?=?"black",alpha=1,size=.1)?+scale_color_gradientn(colors?=?jet.colors(7),name="PEH(mm)")+#添加經緯度線scale_x_continuous(breaks?=?seq(-180,?180,?by?=?30))?+scale_y_continuous(breaks?=?c(seq(-80,?80,?by?=?20),?85))?+?labs(x="",y="",title?=?"Example?of?<span style='color:#D20F26'>BIO34-Potential?Evapotranspiration?(PET,?mm/y)</span>",subtitle?=?"processed?map?charts?with?<span style='color:#1A73E8'>geom_sf()</span>",caption?=?"Visualization?by?<span style='color:#DD6449'>DataCharm</span>")?+theme_ipsum(base_family?=?"Roboto?Condensed")?+theme(#plot.margin?=?grid::unit(c(0,0,0,0),?"mm"),?#去除圖片保存的留白問題plot.title?=?element_markdown(hjust?=?0.5,vjust?=?.5,color?=?"black",size?=?20,?margin?=?margin(t?=?1,?b?=?12)),plot.subtitle?=?element_markdown(hjust?=?0,vjust?=?.5,size=15),plot.caption?=?element_markdown(face?=?'bold',size?=?12),#設置刻度大小axis.title?=?element_text(size=8),#設置圖例屬性legend.position?=?"bottom",legend.text?=?element_text(color?=?"black",size?=?10),legend.key.width?=?unit(15,?"mm"),legend.key.height?=?unit(4,?"mm"))
最終的可視化效果如下:
有小伙伴可能會說“沒有灰色的背景”,這里說下以下,我們在不刪除NA值的情況下繪制就會有對應的灰色背景值,刪除NA值后則沒有。我們也放出沒有刪除NA值的可視化結果:
總結
這一期我們還是分享了可視化繪制技巧,希望對大家繪制空間nc網格數據有所幫助,而Python 處理及可視化的繪制操作打算和空間插值的放在一起,嘗試使用視頻的形式分享給大家~