问题
I want to fill a map with some countries from UE, and then some continents like Asia and Africa, according to my variable prob2
values . This is my data map_d
:
state prob2
<chr> <dbl>
Germany 0.6
Austria 2.9
Belgium 1.9
Bulgaria 0.6
Cyprus 0.0
Croatia 1.7
...
Other Asian 9.2
Other African 2.5
Other North American 10.7
Other Latin American 2.3
Other Oceania 5.0
Firstly I fill the countries of Europe, using this code:
europ_map <- map_data("world", region = c(
"Germany",
"Austria",
"Belgium",
"Bulgaria",
"Chipre",
"Croacia",
"Denmark",
"Slovakia",
"Slovenia",
"Spain",
"Estonia",
"Finland",
"France",
"Greece",
"Hungary",
"Ireland",
"Italy",
"Latvia",
"Lithuania",
"Luxembourg",
"Malta",
"Norway",
"Netherlands",
"Poland",
"Portugal",
"UK",
"Czech Republic",
"Romania",
"Sweden"))
fin_map <- merge(europ_map, map_d, by.x="region", by.y="state")
library(plyr)
fin_map <- arrange(fin_map, group, order)
ggplot(fin_map, aes(x=long, y=lat, group=group, fill=prob2)) +
geom_polygon(colour = "white") +
coord_map("polyconic")
Which produces this map: Europe Map
Now, I need to add shape of continents to my map, and fill with the value of prob2
. Is possible?
I found in this post how to plot continents but is a different way to do: David Ameller's question, and Im not able to add variable values throught this code.
Thanks in advance!!
回答1:
FWIW, here's a starter:
library(tidyverse)
wm <- map_data("world")
cc <- raster::ccodes()
head(cc[,c(1:3, 8:10)], 3)
# NAME ISO3 ISO2 UNREGION1 UNREGION2 CONTINENT
# 1 Aruba ABW AW Caribbean Americas South America
# 2 Afghanistan AFG AF Southern Asia Asia Asia
# 3 Angola AGO AO Middle Africa Africa Africa
dat <- read.csv(text="state, prob2
Other Asian, 9.2
Other African, 2.5
Other North American, 10.7
Other Latin American, 2.3
Other Oceania, 5.0")
mappings <- c("Asia"="Other Asian", "Africa"="Other African") # you add the others here
cc$MYCONTINENTS <- mappings[cc$CONTINENT]
cc <- left_join(cc, dat, by = c("MYCONTINENTS"="state"))
## 31 country names need to be mapped...
wm$region %>% unique %>% setdiff(cc$NAME)
# ...
# [7] "Canary Islands" "UK" "Heard Island"
# ...
## For example, UK is called United Kingdom in cc:
unique(grep("Kingdom", cc$NAME, value=T, ignore.case=T))
# [1] "United Kingdom"
mappings <- c("UK"="United Kingdom", "USA"="United States") # You add the others here
cc$NAME[match(mappings, cc$NAME)] <- names(mappings)
wm <- left_join(wm, cc[,c("NAME","MYCONTINENTS", "prob2")], by=c("region"="NAME"))
ggplot() +
geom_polygon(aes(x=long, y=lat, group=group, fill=prob2), wm, colour = NA) +
coord_quickmap()
You'll have to map your continents to the database ones, and the country names in the database to the ones you get from map_data
. After that, add + geom_polygon(aes(x=long, y=lat, group=group, fill=prob2), wm, colour = NA)
to your code.
来源:https://stackoverflow.com/questions/43801030/filling-countries-and-continents-with-maps-library-according-to-variable-value