地图可视化绘制 | R-ggplot2 NC地图文件可视化

2021-01-25 12:19:15 浏览数 (1)

  • nc数据文件的R包读取
  • nc数据的可视化绘制

nc数据文件的R包读取

在R中读取nc文件,我们首选ncdf4包,其使用参考网址如下:https://rdrr.io/cran/ncdf4/。这里简单介绍下主要的函数:

  1. print.ncdf4: Print Information About a netCDF File(输出nc文件基本信息)。
  2. nc_open(): Open a netCDF File(打开nc文件)。
  3. ncvar_get(): Read data from a netCDF file(读取nc文件中变量数据)。
  4. ncatt_get(): Get attribute from netCDF file(获取ncw文件属性)。对应nc文件,常用的使用方法就是以上4中,数据获取后(由于是规整的数据格式)可以像其他数据一样进行处理和变换。更多详细内容可参考上面给出的网站。

nc数据的可视化绘制

由于我们使用的是ggplot2进行绘制,所以我们直接使用raster包进行nc文件的读取(其实也是调用ncdf4包进行处理),数据我们就使用昨天分享数据的数据:数据(代码)分享 | 全球生物气候指标数据集。具体代码如下:

代码语言:javascript复制
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,方便绘图:

代码语言:javascript复制
dset01_df <- as.data.frame(dset01,xy = TRUE)
head(dset01_df)

可以看到数据还是有很多NA值的,这里我们选择将NA值删除,当然,你也可以不删除处理,代码如下(包含重命名):

代码语言:javascript复制
dset01_df  <-  dplyr::rename(dset01_df,long = x,lat=y)
dset01_df_nona <- dset01_df %>% filter(!is.na(Potential.Evapotranspiration.Hargreaves))

结果如下:

接下来,我们就可以进行可视化设置了,这里直接给出绘图代码哈:

代码语言:javascript复制
#自定义颜色
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)的长宽等属性:

代码语言:javascript复制
legend.text = element_text(color = "black",
                          size = 11),
legend.key.width = unit(5.2, "mm"),
legend.key.height = unit(12, "mm")

倒是要想获取数据资料分享中的可视化效果,我们需使用sf包对数据进行投影转换及使用*geom_sf()*进行转换结果的可视化绘制,代码如下:

代码语言:javascript复制
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 处理及可视化的绘制操作打算和空间插值的放在一起,尝试使用视频的形式分享给大家~

代码语言:javascript复制

0 人点赞