使用R中的栅格包为特定国家的省份自定义颜色 [英] custom color for provinces in specific country using raster package in R
本文介绍了使用R中的栅格包为特定国家的省份自定义颜色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试为特定国家的每个省(绿、红、蓝)贴标签,如下所示:
library(raster)
library(rgeos)
library(ggplot2)
library(dplyr)
iran <- getData("GADM", country = "Iran", level = 1)
map <- fortify(iran)
map$id <- as.integer(map$id)
dat <- data.frame(id = 1:(length(iran@data$NAME_1)),
state = iran@data$NAME_1,
pr = c(530, -42, 1673, 75, 206, 544, 1490, 118, 75,
40, 105, 191, 111, 810, 609, 425, 418, 550, 40, 425, -54, -50,
16, 18, 133,425, -30, 241,63, 191,100))
dat <- dat %>% mutate(color_province = case_when(pr <= 50 ~ 'green',
pr > 150 ~ 'red',
TRUE ~ 'yellow'))
我想设置每个省的自定义颜色(使用‘dat’数据框),如下所示:
> dat
id state pr color_province
1 1 Alborz 530 red
2 2 Ardebil -42 green
3 3 Bushehr 1673 red
4 4 Chahar Mahall and Bakhtiari 75 yellow
5 5 East Azarbaijan 206 red
6 6 Esfahan 544 red
7 7 Fars 1490 red
8 8 Gilan 118 yellow
9 9 Golestan 75 yellow
10 10 Hamadan 40 green
11 11 Hormozgan 105 yellow
12 12 Ilam 191 red
13 13 Kerman 111 yellow
14 14 Kermanshah 810 red
15 15 Khuzestan 609 red
16 16 Kohgiluyeh and Buyer Ahmad 425 red
17 17 Kordestan 418 red
18 18 Lorestan 550 red
19 19 Markazi 40 green
20 20 Mazandaran 425 red
21 21 North Khorasan -54 green
22 22 Qazvin -50 green
23 23 Qom 16 green
24 24 Razavi Khorasan 18 green
25 25 Semnan 133 yellow
26 26 Sistan and Baluchestan 425 red
27 27 South Khorasan -30 green
28 28 Tehran 241 red
29 29 West Azarbaijan 63 yellow
30 30 Yazd 191 red
31 31 Zanjan 100 yellow
举个例子,‘阿德比勒’省是绿色的,‘赞江’省是黄色的。我使用‘Fill’参数设置自定义颜色,下面是我的尝试:
map_df <- inner_join(map, dat, by = "id")
centers <- data.frame(gCentroid(iran, byid = TRUE))
centers$state <- dat$state
ggplot() +
geom_map(data = map_df, map = map_df,
aes(map_id = id, group = group,
x = long, y = lat,
fill = as.factor(color_province))) +
geom_text(data = centers, aes(label = state, x = x, y = y), size = 3) +
coord_map() +
labs(x = "", y = "", title = "Iran Province") +
scale_fill_manual(values = list(yellow = 'yellow', red = 'red', green = 'green'))
但它不起作用。根据"日期"数据框,"阿德比勒"是"绿色"的,但在地图上是红色的。有没有更好的方法来做这件事?
推荐答案
既然您问我,我就快速浏览了一下您的代码。您对id
的假设基本上是错误的。当您使用fortify()
时,您可能认为id
是按正常顺序分配的(例如,1到n)。但事实并非如此。只需运行unique(mymap$id)
即可。你会明白我的意思的。那么解决方案是什么呢?创建dat
时,需要rownames(iran@data)
。一旦这样做了,你应该会没事的。请参阅最终图形。
library(raster)
library(rgeos)
library(ggplot2)
library(dplyr)
iran <- getData("GADM", country = "Iran", level = 1)
mymap <- fortify(iran) # This is the hidden cause
mymap$id <- as.integer(mymap$id)
dat <- data.frame(id = rownames(iran@data), # This is what you needed.
state = iran@data$NAME_1,
pr = c(530,-42,1673,75,206,544,1490,118,75,
40,105,191,111,810, 609,425,418,550, 40, 425, -54,-50,
16, 18, 133,425, -30, 241,63, 191,100)) %>%
mutate(color_province = case_when(pr <= 50 ~ 'green',
pr > 150 ~ 'red',
TRUE ~ 'yellow'))
mydf <- inner_join(mymap, dat, by = "id")
centers <- data.frame(gCentroid(iran, byid = TRUE))
centers$state <- dat$state
ggplot() +
geom_map(data = mydf,
map = mydf,
aes(map_id = id, group = group,
x = long, y = lat,
fill = as.factor(color_province))) +
geom_text(data = centers,
aes(label = state, x = x, y = y), size = 3) +
coord_map() +
labs(x = "", y = "", title = "Iran Province") +
scale_fill_manual(values = c("green", "red", "yellow"),
name = "Province")
这篇关于使用R中的栅格包为特定国家的省份自定义颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文