跟着NBT学做图:样本地理信息图

今天我们来学习一下刘永鑫老师2019年发表在Nature Biotechnology上的文章NRT1.1B is associated with root microbiota composition and nitrogen use in field-grown rice中的代码。

其代码和数据都已经在其github[1]免费分享,按下图操作即可全部打包。下载缓慢的朋友也可在同名gzh回复「20220902」获得压缩包。

图1 a主要介绍了本研究中样本籼稻(indica)和粳稻(japonica)的位置。

源代码

首先我放上经过我详细注释后的代码。

library(dplyr)
library(maptools)
library(ggthemes)
library(ggplot2)
library(maps)

geotable = read.table("varieties_geo.txt", header = T, sep = "\t") # 读取地理信息
worldmap = map_data("world") # 引入世界地图数据
# 通过?map_data查看,仅能提供county,france,italy,nz,state,usa,world,world2等几款地图

fig1 = ggplot(geotable, aes(Longitude, Latitude, color = Subspecies)) +
  geom_polygon(data = worldmap, aes(x = long, y = lat, group = group, fill = NA), 
               color = "grey70", size = 0.25)+ # 绘制地图
  geom_point(size = 2, alpha = 0.5)+ # 绘制具体的位置点
  scale_colour_brewer(palette = "Set1") + # 设置主题颜色
  scale_fill_brewer(palette = "Set1")+  # 设置主题颜色
  scale_y_continuous(breaks = (-3:3)*30)+ # 将Y轴的刻度限制为-90~90
  scale_x_continuous(breaks = (-6:6)*30)+ # 将X轴的刻度限制为-180~180
  labs(x="Longitude", y="Latitude", colour = "Subspecies" ) + # 修改X轴、Y轴及图例
  theme_tufte() # 需要library(ggthemes)
fig1
ggsave(paste0(output_dir, "minicore-worldmap.pdf", sep=""), fig1, width = 9, height = 5)

函数详解

map_data()

map_data()[2]是ggplot2的一个函数,用于将map包中的数据转换为适合ggplot2绘图的框架。

「主要用法」

map_data(map, region = ".", exact = FALSE, ...)

「主要参数」

  • map:可以提供的地图,包括county(United States County Map), france,italy, nz(New Zealand Basic Map),state(United States State Boundaries Map), usa(United States Coast Map), world(Low (mid) resolution World Map), world2(Pacific Centric Low resolution World Map)。
  • region:包含子区域的名称,默认包含所有子区域。
  • exact:将region视为正则表达式(FALSE)还是固定字符串(TRUE)。

「示例」

library(ggplot2)
states <- map_data("state") # 引入美国地图
arrests <- USArrests
names(arrests) <- tolower(names(arrests)) # 将arrests的列名改为小写
arrests$region <- tolower(rownames(USArrests)) # 将USArrests的行名转换为小写并作为新增的一列保存为region,用于后续合并

choro <- merge(states, arrests, sort = FALSE, by = "region") # 通过region合并states和arrests
ggplot(choro, aes(long, lat)) + # 根据经纬度绘制地图
  geom_polygon(aes(group = group, fill = assault)) +
  coord_map("albers", lat0 = 45.5, lat1 = 29.5) 
# coord_map() 将地球的一部分近似球面投影到一个平面的2D平面上
# albers(lat0,lat1):equal-area, true scale on lat0 and lat1

USArrests[3]包含了1973年美国50个州每10万居民中因袭击(assault)、谋杀(murder)和强奸(rap)而被捕的人数,还给出了生活在城市地区的人口百分比(urbanpop,Percent urban population)。

geom_polygon()

geom_polygon()[4]非常类似于由geom_path()绘制的路径,只不过起始点和结束点相连,内部可以填充。group映射决定了哪些case被连接在一起成为一个多边形。

「主要用法」

geom_polygon(
  mapping = NULL,
  data = NULL,
  stat = "identity",
  position = "identity",
  rule = "evenodd",
  ...,
  na.rm = FALSE,
  show.legend = NA,
  inherit.aes = TRUE)

「主要参数」

  • mapping:同ggplot2
  • data:同ggplot2
  • stat:使用的统计转换
  • position:位置调整
  • rule:可选evenodd或winding,如果要绘制带孔的多边形,这个参数定义了如何解释孔的坐标,示例[5]。
  • na.rm:默认情况下(False),缺失值会被移除并警告;选择True,缺失值会被悄无声息的移除。
  • show.legend:默认不展示。
  • inherit.aes:如果选择False,将会覆盖默认的映射(aesthetics),而不是将它们结合。

「注意⚠️」

在源代码中,关于geom_polygon的参数group,有一点需要注意。

geom_polygon(data = worldmap, aes(x = long, y = lat, group = group, fill = NA), 
               color = "grey70", size = 0.25)

在这里group=group,而观察后我们发现,每个region对应了一个group,比如Aruba对应group 1,Afghanistan对应group 2,enclave对应group 1627,既然这样,能否group=region呢?

此时你应该明白,地图数据中的group是有意义的,决定了连线的先后顺序,在其他地图包中也有该顺序。

美化

我对代码进行了微调,包括地图背景颜色、字/点的大小、透明度,把图限制在了一定区间范围,同时修改了主题。

library(dplyr)
library(maptools)
library(ggthemes)
library(ggplot2)
library(maps)
library(ggsci)
geotable = read.table("varieties_geo.txt", header = T, sep = "\t") # 读取地理信息
worldmap = map_data("world") # 引入世界地图数据
# 通过?map_data查看,仅能提供county,france,italy,nz,state,usa,world,world2等几款地图

fig = ggplot(geotable, aes(Longitude, Latitude, color = Subspecies)) +
  geom_polygon(data = worldmap, aes(long, lat, group = group, fill = NA), 
               color = "grey70",fill = "#F5F5DC", size = 0.25) + # 绘制地图
  geom_point(size = 1.7, alpha = 0.8)+ # 绘制具体的位置点
  labs(x="Longitude", y="Latitude", color = "Species" ) + # 修改X轴、Y轴及图例
  coord_cartesian(xlim = c(-120,150), ylim = c(-40,70)) +
  theme_tufte() + # 需要library(ggthemes) 
  theme(axis.ticks = element_line(linetype = "blank"), # 去掉坐标轴
  axis.text = element_text(colour = NA), # 去掉坐标轴的数字标记
  panel.background = element_rect(fill = '#F0FFFF'), # 背景色
  axis.title = element_text(size = 13),
  legend.text = element_text(size = 10),
  legend.title = element_text(size = 12),
  legend.position = c(0.06, 0.075)) + # 修改图例位置
  scale_color_aaas() # 修改主题 
 
fig

如果你用上了他们的代码,请务必按照下列方法引用:

Jingying Zhang#, Yong-Xin Liu#, Na Zhang#, Bin Hu#, Tao Jin#, Haoran Xu, Yuan Qin, Pengxu Yan, Xiaoning Zhang, Xiaoxuan Guo, Jing Hui, Shouyun Cao, Xin Wang, Chao Wang, Hui Wang, Baoyuan Qu, Guangyi Fan, Lixing Yuan, Ruben Garrido-Oter, Chengcai Chu* & Yang Bai*. NRT1.1B is associated with root microbiota composition and nitrogen use in field-grown rice. Nature Biotechnology. 2019. doi:10.1038/s41587-019-0104-4

参考资料

[1]

github链接: https://github.com/microbiota/Zhang2019NBT

[2]

map_data(): https://ggplot2.tidyverse.org/reference/map_data.html

[3]

USArrests: https://www.rdocumentation.org/packages/datasets/versions/3.6.2/topics/USArrests

[4]

geom_polygon(): https://ggplot2.tidyverse.org/reference/geom_polygon.html

[5]

geom_polygon() rule参数示例: https://rdrr.io/r/grid/grid.path.html

本文使用 文章同步助手 同步

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,968评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,682评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,254评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,074评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,964评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,055评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,484评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,170评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,433评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,512评论 2 308
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,296评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,184评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,545评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,150评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,437评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,630评论 2 335

推荐阅读更多精彩内容