我对 R 还很陌生,我正在尝试使用 adm1(或州)分区来绘制阿根廷 Ant 物种的分布图。
我已经从 GADM 网站下载了数据,并且创建了一个 csv 文件,其中包含说明每个 adm1 中是否存在该物种的信息。 即使我没有渐变,我仍然可以制作等值线吗?如果没有,我还可以使用哪些其他类型的 map ?
我浏览了几个网站,包括 Infomaps using R , How to make choropleths in R ,以及 Choropleth map 挑战,这确实很有帮助,但它们都有数字数据,而且我使用的是present(1)或absent(0)列。我尝试过的不同软件包有 sp
(带有 RColorBrewer
)、ggplot2
、rgeos
和 map 工具
。
这是我到目前为止的代码:
library(sp)
library(RColorBrewer)
write.csv(atr, "atr_data.csv")
atr_data<-read.csv("atr_data.csv", header=TRUE)
spcode country_code adm1_code newcol
1 atr VEN VE.AR 0
2 atr PRY PY.CE 0
3 atr PAN PA.CL 0
4 atr PAN PA.CL 0
5 atr PAN PA.PN 0
6 atr PAN PA.PN 0
我正在创建一个包含完整 adm1 名称而不是代码的列,以便它与 GADM 文件匹配(因此我还没有编写用于合并数据的代码)。
#to retrieve map for Argentina ARG
con <- url("http://gadm.org/data/rda/ARG_adm1.RData")
print(load(con))
close(con)
#to generate random colors on map
col = rainbow(length(levels(gadm$NAME_1)))
spplot(gadm, "NAME_1", col.regions=col, main="ARG Regions", colorkey = FALSE, lwd=.4,col="white")
#this piece of code is a mess
col_no <- as.factor(as.numeric(atr_data$newcol[order],
c(0,1)))
levels(col_no)<- c("0", "1")
gadm$col_no <- col_no
myPalette<-brewer.pal(3, "Purples")
spplot(gadm, "col_no", col=grey(.9),
col.regions=myPalette,
main="Distribution of Atratus in Argentina")
任何帮助将不胜感激,谢谢!
最佳答案
您提供的示例中出现了一些小问题。
首先,可以使用 gadm@data$col_no
而不是 gadm$col_no
访问空间多边形数据帧的数据槽。填写完存在/缺席表后,您可以通过直接访问插槽或使用 maptools
包中的 spCbind
添加存在/缺席数据到空间多边形数据框。
其次,如果您的 col_no
因子只有 2 个级别,则必须将 MyPalette
子集为 2 种颜色,因为 Brewer 调色板只能使用最少的颜色3 级。
library(sp)
library(RColorBrewer)
con <- url("http://gadm.org/data/rda/ARG_adm1.RData")
print(load(con))
close(con)
# Randomly assigning presence/absence data for display purposes only
gadm@data$col_no <- as.factor(rbinom(n = 24, size = 1, prob = 0.5))
myPalette <- brewer.pal(3, "Purples")
# col.regions is limited to 2 colors below with the middle color dropped.
spplot(gadm, zcol = "col_no", colorkey = TRUE, col.regions = myPalette[-2],
main="Distribution of Atratus in Argentina")
关于r - 在 R 中不使用梯度制作 Choropleth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16904848/