我目前拥有英国的shapefile,并绘制了英国不同地区的物种种群。到目前为止,我刚刚绘制了3个物种种群,并将它们染成红色=高,橙色= med,绿色=低。但我想做的是有一个梯度图而不是仅仅被3种颜色限制。 到目前为止,我有一个名为Count的表,其中区域为列名,然后是下面每个区域的物种数。我的最低计数为0,最高计数为2500左右,计数区域与我的shapefile中的区域匹配。我有一个函数可以根据你自己输入的关卡确定什么是高,中,低?
High<-colnames(Count)[which(Count>'input value here')]
然后将这些绘制到shapefile上,如下所示:
plot(ukmap[(ukmap$Region %in% High),],col='red',add=T)
不幸的是我无法安装任何软件包,我正在考虑使用colorRamp,但我不确定该怎么办?
编辑:我的数据看起来像这样
Wales Midlands North Scotland South East South West
1 551 32 124 1 49 28
3 23 99 291 152 164 107
4 1 7 17 11 21 14
7 192 32 12 0 1 9
9 98 97 5 1 21 0
并且第一列只是一个代表物种的数字,目前我有一个函数可以将计数绘制到英国shapefile上,但是基于high,med和low的边界。上面的数据没有附加到我的shapefile。然后我遍历我的数据集的每一行(种类)并为每一行(物种)绘制一个新的地图。
答案 0 :(得分:6)
plot
对我来说太难理解,所以我们将使用ggplot2
。
# UK shapefile found via http://www.gadm.org/download
uk.url <- "http://www.filefactory.com/file/s3dz3jt3vr/n/GBR_adm_zip"
# replace following with your working directory - no trailing slash
work.dir <- "C:/Temp/r.temp/gb_map"
# the full file path for storing file
file.loc <- paste0(work.dir, "/uk.zip")
download.file (uk.url, destfile = file.loc, mode = "wb")
unzip(file.loc, exdir = work.dir)
# open the shapefile
require(rgdal)
require(ggplot2)
uk <- readOGR(work.dir, layer = "GBR_adm2")
# use the NAME_2 field (representing counties) to create data frame
uk.map <- fortify(uk, region = "NAME_2")
# create fake count data...
uk.map$count <- round(runif(nrow(uk.map), 0, 2500), 0)
# quick visual check
ggplot(uk.map, aes(x = long, y = lat, group = group, fill = count)) +
geom_polygon(colour = "black", size = 0.5, aes(group = group)) +
theme()
这会生成下面的输出,这可能与您需要的类似。
请注意,在这种情况下,我们不会明确指定渐变 - 我们只需将其保留为ggplot
。如果您希望指定这些细节,可能会更多参与。如果你沿着那条路走下去,你应该在uk.map
中创建另一个列,使用cut
函数将每个计数分配到(例如)10个箱中的一个。 uk.map
数据框如下所示:
> str(uk.map)
'data.frame': 427339 obs. of 8 variables:
$ long : num -2.05 -2.05 -2.05 -2.05 -2.05 ...
$ lat : num 57.2 57.2 57.2 57.2 57.2 ...
$ order: int 1 2 3 4 5 6 7 8 9 10 ...
$ hole : logi FALSE FALSE FALSE FALSE FALSE FALSE ...
$ piece: Factor w/ 234 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
$ group: Factor w/ 1136 levels "Aberdeen.1","Aberdeenshire.1",..: 1 1 1 1 1 1 1 1 1 1 ...
$ id : chr "Aberdeen" "Aberdeen" "Aberdeen" "Aberdeen" ...
$ count: num 1549 1375 433 427 1282 ...
>
答案 1 :(得分:4)
好的,这是一个不使用ggplot
的替代解决方案(我将保留ggplot
解决方案以供参考)。这段代码很简单,但它应该足以让您了解如何使其适应您自己的数据。
# UK shapefile found via http://www.gadm.org/download
uk.url <- "http://www.filefactory.com/file/s3dz3jt3vr/n/GBR_adm_zip"
# replace following with your working directory - no trailing slash
work.dir <- "C:/Temp/r.temp/gb_map"
# the full file path for storing file
file.loc <- paste0(work.dir, "/uk.zip")
download.file (uk.url, destfile = file.loc, mode = "wb")
unzip(file.loc, exdir = work.dir)
# open the shapefile
require(rgdal)
uk <- readOGR(work.dir, layer = "GBR_adm2")
# make some fake data to plot
uk@data$count <- round(runif(nrow(uk@data), 0, 2500), 0)
uk@data$count <- as.numeric(uk@data$count)
# and plot it
plot(uk, col = gray(uk@data$count/2500))
代码的结果如下图所示。
编辑跟随请求包含一个图例,我稍微调整了一下代码但是老实说我不明白基础R的legend
功能是否足以获得生产质量,我不希望进一步研究。 (顺便提一下帽子提示到this question的想法。)看一下代码下方的情节表明我们需要重新排序图例颜色等,但我会将其作为练习留给原始海报或作为另一个问题发布
# UK shapefile found via http://www.gadm.org/download
uk.url <- "http://www.filefactory.com/file/s3dz3jt3vr/n/GBR_adm_zip"
# replace following with your working directory - no trailing slash
work.dir <- "C:/Temp/r.temp/gb_map"
# the full file path for storing file
file.loc <- paste0(work.dir, "/uk.zip")
download.file (uk.url, destfile = file.loc, mode = "wb")
unzip(file.loc, exdir = work.dir)
# open the shapefile
require(rgdal)
uk <- readOGR(work.dir, layer = "GBR_adm2")
# make some fake data to plot
uk@data$count <- as.numeric(round(runif(nrow(uk@data), 0, 2500), 0))
uk@data$bin <- cut(uk@data$count, seq(0, 2500, by = 250),
include.lowest = TRUE, dig.lab = 4)
# labels for the legend
lev = levels(uk@data$bin)
lev2 <- gsub("\\,", " to ", lev)
lev3 <- gsub("\\]$", "", lev2)
lev4 <- gsub("\\(|\\)", " ", lev3)
lev5 <- gsub("^\\[", " ", lev4)
my.levels <- lev5
# Create a function to generate a continuous color palette
rbPal <- colorRampPalette(c('red','blue'))
uk@data$Col <- rbPal(10)[as.numeric(cut(uk@data$count, seq(0, 2500, by = 250)))]
# Plot
plot(uk, col = uk@data$Col)
legend("topleft", fill = uk@data$Col, legend = my.levels, col = uk@data$Col)
答案 2 :(得分:0)
您是否尝试过colorRampPalette?
以下是尝试构建渐变调色板的方法
gradient_color <- colorRampPalette(c("blue", "red"))
gradient_color(10)
[1]“#0000FF”“#1C00E2”“#3800C6”“#5500AA”“#71008D”“#8D0071”“#AA0055” [8]“#C60038”“#E2001C”“#FF0000”
示例情节
plot(rep(1,10),col=gradient_color(10))