Я пытаюсь раскрасить карту страны в зависимости от уровня погодных рисков в каждой административной области. Я считаю, что лучше всего это можно сделать на R, хотя мои знания R близки к нулю.
Из этого поста невозможно добавить метки для страны с помощью ggplot, geom_polygon и geom_text, мне удалось запустить код и построить карту рисков для всех стран Африки. Я попытался адаптировать код для своих целей, как показано ниже:
library(sf)
library(ggplot2)
all_districts <- data.frame(region = c("Maseru",
"Butha-Buthe",
"Leribe",
"Berea",
"Mafeteng",
"Mohale's Hoek",
"Quthing",
"Qacha's Nek",
"Mokhotlong",
"Thaba-Tseka"),
risk = c(4, 4, 2, 1, 2, 4, 1, 3, 1, 2))
table(all_districts$risk)
mapdata_x <- map_data('world') %>% filter(region %in% all_districts$region)
mapdata_x <- mapdata_x %>% left_join(all_districts, by='region')
label_data <- mapdata_x %>% group_by(region) %>% filter(row_number() == 1)
ggplot(mapdata_x, aes (x = long, y = lat, group = group)) +
geom_polygon(aes(fill = factor(risk)), linewidth = 0.25, color = "black") +
scale_fill_manual(values = c("#a6d96a", "#ffffbf", "#fdae61", "#d7191c"),
name = "Risk Level") +
theme(axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
axis.ticks = element_blank(),
axis.title.y = element_blank(),
axis.title.x = element_blank(),
rect = element_blank())+
labs(title = "Weather Risk Levels") +
geom_label_repel(data = label_data,
aes(x = long, y = lat, label = region), size = 3,
max.overlaps = 12)
Мой код не работает на линии
mapdata_x <- map_data('world') %>% filter(region %in% all_districts$region)
Выдает ошибку:
Error in h(simpleError(msg, call)) :
error in evaluating the argument 'x' in selecting a method for function '%in%': object 'region' not found.
Как мне это определить, чтобы получить Лесото как регион? Или есть альтернативный способ добиться этого.
Это районы в пределах Лесото. Как получить районы внутри страны, как включить шейп-файл?
Функция map_data извлекает данные из пакета maps. Этот пакет имеет ограниченное количество доступных наборов данных. Вам нужно будет найти какой-нибудь онлайн-источник нужных вам картографических данных. Но Stack Overflow предназначен для того, чтобы задавать конкретные вопросы по программированию, а не для запроса местоположения конкретных данных карты. Возможно, вместо этого попробуйте сайт типа Открытые данные или Географические информационные системы.





library(sf); library(sp)
library(dplyr)
library(ggplot2); library(ggrepel)
download.file("https://biogeo.ucdavis.edu/data/diva/adm/LSO_adm.zip",
"LSO_adm.zip")
unzip("LSO_adm.zip", exdir= "LSO_adm")
mapdata_x <- st_read(dsn = "LSO_adm\\LSO_adm1.shp", quiet = TRUE)
all_districts <- data.frame(region = c("Maseru", "Butha-Buthe",
"Leribe", "Berea",
"Mafeteng", "Mohale's Hoek",
"Quthing", "Qacha's Nek",
"Mokhotlong", "Thaba-Tseka"),
risk = c(4, 4, 2, 1, 2, 4, 1, 3, 1, 2))
mapdata_x <- mapdata_x %>% left_join(all_districts, by = c("NAME_1" = 'region'))
label_data <- suppressWarnings(st_centroid(mapdata_x)) %>%
bind_cols(., st_coordinates(.))
ggplot() +
geom_sf(data = mapdata_x, aes(fill = factor(risk))) +
geom_label_repel(data = label_data, aes(x = X, y = Y, label = NAME_1),
size = 3, max.overlaps = 12) +
labs(title = "Weather Risk Levels") +
scale_fill_manual(name = "Risk Level",
values = c("#a6d96a", "#ffffbf", "#fdae61", "#d7191c")) +
theme(axis.text = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank(),
rect = element_blank())

Created on 2024-03-29 with reprex v2.0.2
У меня это работает, за исключением того, что регионы, которые вы определили внутри
all_districts, не существуют. Это страны или что?