手把手教你用R优雅地绘制研究区地图

news2024/11/27 11:48:46

用R语言绘制研究区图和地图

引言

在地理信息系统和数据可视化领域,绘制研究区图和地图是非常重要的任务。R语言是一种功能强大的统计分析和可视化工具,也可以用于绘制各种类型的地图。本文将介绍如何使用R语言绘制研究区图和地图。

准备工作

在使用R语言进行地图绘制之前,我们需要安装一些必要的包。以下是一些常用的R包:

  • tidyverse:用于绘制数据图形、数据处理的基础包。

  • sf:用于处理空间数据的包。

  • rnaturalearth:提供全球地理数据的包。

  • raster:用于处理栅格数据的包。

  • 我们可以加载这些包:

    library(tidyverse)
    library(rnaturalearth)
    library(sf)
    library(raster)
    library(ggrepel)
    library(showtext)

如果加载失败,请自行安装对应包:

install.packages('pkgname')

数据和变量定义

在开始绘制研究区图之前,我们需要准备好研究区的底图数据。这些数据可以是DEM,例如NASA提供的30mDEM,也可以是土地覆盖,卫星影像等等。在本例中,我们将使用一个矢量数据文件。

首先,定义全局变量,这是一个好习惯。先加载字体。

font_add_google(
  "Lato",
  regular.wt = 300,
  bold.wt = 700)

Google Fonts 存储库 ( https://fonts.google.com/ )中有数千种开源字体。此函数将尝试搜索参数指定的字体系列Lato,然后自动下载所有可能字体的字体文件(“常规”、“粗体”、“斜体”和“粗体斜体”,但没有“符号”) 。如果找到并成功下载字体,它们也将添加到具有给定系列名称的sysfonts中。

接下来,定义画图参数,这里只是给出一个例子,并非都设置为空,可根据自己需要。

这样操作有一个好处是,重复绘图时,ggplot的属性定义不会变得“冗长”,而是直接用theme_map()函数替代。

theme_map <- function(...) {
  theme_minimal() +
    theme(
      text = element_text(family = "Lato", color = "#22211d"),
      axis.line = element_blank(),
      axis.ticks = element_blank(),
      axis.title.x = element_blank(),
      axis.title.y = element_blank(),
      axis.text = element_blank(),
      panel.grid.major = element_blank(),
      panel.grid.minor = element_blank(),
      plot.background = element_rect(fill = "lightblue", color = NA),
      panel.background = element_rect(fill = "lightblue", color = NA),
      legend.background = element_rect(fill = "#ffffff", color = NA),
      strip.background=element_blank(),
      plot.margin = margin(0,0,0,0,"cm"),
      panel.border = element_blank(),
      ...
    )
}

接下来,在实际研究区图中,我们也许需要手动绘制一些点或面来突出某些区域,以点为例。这里定义一个数据框

# create dataframe with locations
df <- data.frame(
  site = c("A", "B"),
  lat = c(30, 40),
  lon = c(0, 0)
)

 接下来读取土地覆盖数据

lc <- raster("data/modis_land_cover.tif")

根据MODIS土地覆盖分类,我们只截取森林即可: 

# select only "tree" areas (classes 1 - 9)
# and convert to binary (1 == tree)
lc <- (lc > 0  & lc < 9)
# reassign the name of the variable "lc"
# see below
names(lc) <- "lc"

附MODIS土地覆盖分类体系表格,可自行查阅。

推荐颜色描述
0000000水体
105450a常绿针叶林:由常绿针叶树(冠层>2m)占主导。树木覆盖度>60%。
2086a10常绿阔叶林:由常绿阔叶和棕榈树(冠层>2m)占主导。树木覆盖度>60%。
354a708落叶针叶林:由落叶针叶(落叶松)树(冠层>2m)占主导。树木覆盖度>60%。
478d203落叶阔叶林:由落叶阔叶树(冠层>2m)占主导。树木覆盖度>60%。
5009900混交林:既不是落叶也不是常绿(各占40-60%)的树种占主导(冠层>2m)。树木覆盖度>60%。
6c6b044闭丛草原:由草本植物和灌木(高度<2m)占主导。树木覆盖度10-60%。
7dcd159开丛草原:由草本植物和灌木(高度<2m)占主导。树木覆盖度<10%。
8dade48永久湿地:土壤或植被表面长期或永久被淡水覆盖的区域。
9fbff13草地:由草本植物占主导,有时也有少量灌木或树木(高度<2m)。
10b6ff05干草地:由草本植物占主导,有时也有少量灌木或树木(高度<2m),但在干旱季节会枯萎或死亡。
1127ff87农田/自然植被复合体:人类活动对土地利用产生了重要影响,但仍有一定程度的自然植被存在,如农田、牧场、人工林等。
12c24f44非灌溉耕地:人类活动对土地利用产生了重要影响,如耕作、收割等,但没有灌溉设施。
13a5a5a5城市和建筑物:人类活动对土地利用产生了重要影响,如建筑、道路、桥

由于ggplot可视化栅格需要Dataframe,还需要把栅格转为Dataframe

# convert from matrix to long format
# 1 row per location
lc <- lc %>%
  rasterToPoints %>%
  as.data.frame() %>%
  filter(lc != 0) # only retain pixels with a value

绘制地图

接下来,可以绘制地图。使用最大的land作为底图,结果如下

p <- ggplot() +
  # first layer is the land mass outline
  # as a grey border (fancy)
  geom_sf(data = land,
          fill = NA,
          color = "grey50",
          fill = "#dfdfdf",
          lwd = 1) +

  # crop the whole thing to size
  coord_sf(xlim = c(-30, 50),
           ylim = c(20, 70))
p

图片

 

 接下来,在底图上叠加countries:

p1 <- p +

  # second layer are the countries
  # with a white outline and and a
  # grey fill
  geom_sf(data = countries,
          color = "white",
          fill = "#dfdfdf",
          size = 0.2) +

  # crop the whole thing to size
  coord_sf(xlim = c(-30, 50),
           ylim = c(20, 70))

p1

图片

 矢量底图完成后,我们继续叠加土地覆盖数据:

p2 <- p1 +

  # then add the tree pixels
  # as tiles in green
  geom_tile(data = lc,
            aes(x = x,
                y = y),
            col = "darkolivegreen4") +

  # crop the whole thing to size
  coord_sf(xlim = c(-30, 50),
           ylim = c(20, 70))
p2

 

图片

 由于ggplot是图层语言,土地覆盖图层叠加后,一些国家边界被遮盖,所以再重新叠加国家数据。

p3 <- p2 +
  # overlay the country borders
  # to cover the tree pixels
  # fill = NA to not overplot
  geom_sf(data = countries,
          color = "white",
          fill = NA,
          size = 0.2) +

 # crop the whole thing to size
 coord_sf(xlim = c(-30, 50),
          ylim = c(20, 70))
p3

图片

 

再叠加需要突出和标记的点或面:

p4 <- p3 +

  # add the locations of the sites
  # as a point
  geom_point(data = df,
             aes(lon, lat),
             col = "grey20") +

  # use ggrepel to add fancy
  # labels nudged to a
  # longitude of -25
  geom_text_repel(
    data = df,
    aes(lon,
        lat,
        label = site),
    nudge_x      = -25 - df$lon,
    direction    = "y",
    hjust        = 0,
    segment.size = 0.2,
    seed = 1 # ensures the placing is consistent between renders
  ) +

  # crop the whole thing to size
  coord_sf(xlim = c(-30, 50),
           ylim = c(20, 70))

p4


 

图片

 

图中有个x,y,影响美观,删掉:

p5 <- p4 +

  # add labels here if needed
  labs(x = NULL,
       y = NULL,
       title = "",
       subtitle = "",
       caption = "") +

  # crop the whole thing to size
  coord_sf(xlim = c(-30, 50),
           ylim = c(20, 70))

p5

图片

 

接下来添加之前定制的图层属性theme_map()函数:

p6 <- p5 +

  # apply the map theme as created above
  theme_map()

p6


 

图片

图片 

总结 

本文介绍了如何使用R语言绘制研究区图地图。通过使用ggplot2包和其他相关的空间数据处理包,我们可以轻松地绘制各种类型的地图。无论是绘制土地覆盖栅格还是其他类型的矢量叠加,R语言提供了丰富的工具和函数,帮助我们更好地理解和可视化地理数据。希望本文对您在使用R语言进行地图绘制方面有所帮助!

最后附录一张操作汇总

图片

图片

仅供学习,来自地学实践教程。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/940534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

skywalking agent监控java服务

一、前言 skywalking agent可以监控的服务类型有多种&#xff0c;python、go、java、nodejs服务等都可以监控&#xff0c;现在通过java服务来演示skywalking agent的使用&#xff0c;并且是使用容器的方式实现 二、部署skywalking agent监控 需要注意&#xff0c;skywalking…

高忆管理:什么叫满仓?

满仓是股市术语之一&#xff0c;指出资者将所有资金用于股票出资&#xff0c;即持有的股票数量到达最大值。满仓出资是一种高风险高回报的出资战略&#xff0c;存在着带来高收益的或许性&#xff0c;但也或许面对巨大的亏本风险。 从理财视点来看&#xff0c;满仓出资是不明智…

Leetcode适合新手吗?0基础怎么较短时间得到算法数据结构提升?揭秘大牛都在用的刷题工具!...

别再用leetcode无脑刷题了&#xff01; 刷题不应该量化为“刷多少道题”&#xff0c;对于刷题来说&#xff0c;永远不是追求数量的堆叠。 你想&#xff0c;LeetCode 上的题难度不等&#xff0c;有简单、中等、困难。 刷100道简单题倒是快&#xff0c;一个星期保证完事&#xff…

具有优异导电性能且抑制了准饱和效应的1200V 4H-SiC沟槽MOSFET

标题&#xff1a;1200V 4H-SiC trench MOSFET with superior figure of merit and suppressed quasi-saturation effect 摘要 本文提出一种具有部分被埋层n区包围的p屏蔽区的优异性能(FoM)1200V 4H-SiC沟槽MOSFET。在准饱和(QS)状态下&#xff0c;埋层n区抑制由p屏蔽区形成的耗…

SharedPreference

Android中的SharedPreference是轻量级的数据存储方式&#xff0c;能够保存简单的数据类型。比如String、int、boolean值等。其内部是以XML结构保存在/data/data/包名/shared_prefs文件夹下&#xff0c;数据以键值对的形式保存。是线程安全的&#xff0c;但不是进程安全的。 1.…

electron globalShortcut 快捷键,在焦点移到其他软件上时,调用快捷键报错

用 electron 开发软件&#xff0c;在设置了 globalShortcut 快捷键后&#xff0c;在当前开发的软件上调用快捷键正常&#xff0c;但是当焦点不在当前软件时&#xff0c;在使用快捷键&#xff0c;好些时候会报错。大概率与系统快捷键产生冲突或者快键键控制的回调里获取的内容&a…

全新UI站长在线工具箱系统源码带后台开源版

该系统的全开源版本可供下载&#xff0c;并且支持暗黑模式。 系统内置高达72种站长工具、开发工具、娱乐工具等功能。此系统支持本地调用API&#xff0c;同时还自带免费API接口&#xff0c; 是一个多功能性工具程序&#xff0c;支持后台管理、上传插件、添加增减删功能。 环…

行业追踪,2023-08-28

自动复盘 2023-08-28 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

LNMT与动静分离

目录 前言 一、简要思路 二、NGINX的配置参考 1、location 2、rewirte 三、动静分离配置&#xff08;单机配置&#xff09; 1、Tomcat配置 2、配置NGINX 3、安装mariadb 4、测试 Tomcat8080​编辑 Tomcat8081 访问不存在的页面 前言 LNMT&#xff08;Linux Nginx MySQL Tom…

什么是网络取证(Network Forensics)

企业采用新技术来检查其网络安全是否存在零日漏洞&#xff0c;与立即指示问题的物理层不同&#xff0c;黑客攻击尝试可能会被忽视并变得严重&#xff0c;直到对网络流量有一个整体的可见性。通过实时监控来跟踪其源和目标的流量&#xff0c;以查明问题或潜在问题的根源。 什么…

CY3-DBCO活性荧光染料-星戈瑞

​欢迎来到星戈瑞荧光stargraydye&#xff01;小编带您盘点&#xff1a; CY3-DBCO是一种活性荧光染料&#xff0c;它是由Cyanine3&#xff08;CY3&#xff09;荧光染料与DBCO&#xff08;dibenzocyclooctyne&#xff09;官能团共轭而成的化合物。 活性荧光染料通常是指具有特定…

Android RecyclerView 之 列表宫格布局的切换

前言 RecyclerView 的使用我就不再多说&#xff0c;接下来的几篇文章主要说一下 RecyclerView 的实用小功能&#xff0c;包括 列表宫格的切换&#xff0c;吸顶效果&#xff0c;多布局效果等&#xff0c;今天这篇文章就来实现一下列表宫格的切换&#xff0c;效果如下 一、数据来…

k8s的交付与部署

一 k8s的概念 1.1 k8s k8s是一个轻量级的&#xff0c;用于管理容器化应用和服务的平台。通过k8s能够进行应用的自动化部署和扩容缩容。 1.2 k8s核心部分 1.prod: 最小的部署单元&#xff1b;一组容器的集合&#xff1b;共享网络&#xff1b;生命周期是短暂的&#xff1b; …

ChatGPT在医疗领域可应用于改善与患者的沟通

注意&#xff1a;本信息仅供参考&#xff0c;发布该内容旨在传递更多信息的目的&#xff0c;并不意味着赞同其观点或证实其说法。 自从ChatGPT在2022年末对公众开放以来&#xff0c;OpenAI的这款生成式AI聊天机器人在医疗领域展示出了巨大潜力。它已经通过了美国医学执照考试&a…

3. 运行时数据区及程序计数器

3.1. 运行时数据区 3.1.1. 概述 本节主要讲的是运行时数据区&#xff0c;也就是下图这部分&#xff0c;它是在类加载完成后的阶段 当我们通过前面的&#xff1a;类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后&#xff0c;就会用到执行引擎对我们…

Centos7更新glibc2.18

Centos7更新glibc2.18 查看glibc版本下载解压glibc2.18编译安装结果验证 查看glibc版本 # 查看glibc版本 ldd --version下载解压glibc2.18 参考: https://blog.csdn.net/qq_39295044/article/details/86685789 https://blog.csdn.net/myhes/article/details/106923039 # 下载…

安装配置mariadb

记录下安装配置mariadb的经历。 环境&#xff1a;ubuntu22 一、apt在线安装 apt代理配置 APT是Ubuntu系统中用于安装和升级软件包的工具&#xff0c;如果本地没有可用的软件包&#xff0c;APT将会连接到远程软件包服务器下载软件包。在某些情况下&#xff0c;用户需要将APT的…

UE5- socket客户端写法

# 实现目标 ue5 c 实现socket客户端&#xff0c;读取服务端数据&#xff0c;并进行解析 #实现步骤 {projectName}.Build.cs里增加 "WebSockets","JsonUtilities", "Json"配置信息&#xff0c;最终输出如下&#xff1a; using UnrealBuildTool;…

msvcr110.dll怎么安装?多种方法教你快速修复msvcr110.dll文件

最近很多小伙伴在咨询&#xff0c;msvcr110.dll怎么安装这个问题&#xff0c;其实要安装这个还是比较简单的&#xff0c;而且方法有很多种&#xff0c;每一种方法都有各种的优势&#xff0c;我们只要选择适合我们的一种方法就可以了。好了&#xff0c;下面我们一起来了解一下快…

微信小程序云开发-云存储文件ID转http

一、前言 云开发的云储存文件默认是以cloudID的形式读取的&#xff0c;但是这种读取方式只能在微信小程序或内嵌H5中使用。 所以如果需要在其他地方使用&#xff0c;例如浏览器或网站等其他端读取文件的时候&#xff0c;需要转换成普通的http链接。 目前官方提供有转换的接口…