У меня небольшая проблема с маркировкой моей карты ggplot.
Вот как я рисую свою карту в ggplot, и это работает хорошо:
library(ggmap)
library(scales)
Kenya1_df<- as.data.frame(Kenya1_df)
theme_opts<-list(theme(panel.grid.minor = element_blank(),
panel.grid.major = element_blank(),
panel.background = element_blank(),
plot.background = element_blank(),
axis.line = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank(),
plot.title = element_blank()))
ggplot() +
geom_polygon(data = Kenya1_df, aes(x = long, y = lat, group = group, fill =
count), color = "black", size = 0.25) +
theme(aspect.ratio=1)+
scale_fill_distiller(name = "Count", palette = "Reds", breaks = pretty_breaks(n = 5))+
#geom_text(aes(label =Kenya1_df$NAME_1, x = Kenya1_df$long, y = Kenya1_df$lat))+
labs(title = "Nice Map")
Результат у меня хороший
Вот где начинается моя проблема: в тот момент, когда я добавляю метки с помощью geom_text(aes(label =Kenya1_df$NAME_1, x = Kenya1_df$long, y = Kenya1_df$lat))
, я получаю очень беспорядочную карту.
Вот как выглядит код:
ggplot() +
geom_polygon(data = Kenya1_df, aes(x = long, y = lat, group = group, fill =
count), color = "black", size = 0.25) +
theme(aspect.ratio=1)+
scale_fill_distiller(name = "Count", palette = "Reds", breaks = pretty_breaks(n = 5))+
geom_text(aes(label =Kenya1_df$NAME_1, x = Kenya1_df$long, y = Kenya1_df$lat))+
labs(title = "Nice Map")
Я получаю эту грязную карту
Теперь в наборе данных у меня есть столбец с именем count, который определяет, какие области должны быть окрашены. Я заметил, что в этом наборе данных есть регионы с NA в фрейме данных count, и поэтому я предполагаю, что во время маркировки все эти регионы помечаются.
Вот фрагмент данных
Позвольте мне предоставить эту ссылку, чтобы помочь вам загрузить данные о стране. Вот ссылка для загрузки картографических данных картографических данных и эта статья поможет в загрузке статьи. Таким образом, после загрузки мы предполагаем, что только 5 округов имеют данные для построения или раскрашивания.
Мой вопрос заключается в том, как я могу пометить и сосредоточиться только на значениях строк с числами в столбце подсчета или есть ли какой-либо другой умный способ маркировки, не искажая видимость вывода карты. Обратите внимание, что не все регионы имеют данные, я хочу сосредоточиться только на тех, у которых есть данные, но при этом есть полная карта.
@TarJae, Умное предположение, но я получаю эту ошибку Aesthetics must be either length 1 or the same as the data (312417): label
Я уверен, что нам нужно настроить данные в вашем случае, но я не могу воспроизвести ваш пример. Разбейте его на 10 Name_1, создайте воспроизводимый пример с данными о длинной широте.
@Tarjae Можете ли вы рассказать мне, что мне нужно сделать, я пытаюсь получить воспроизводимые данные, но это будет сложно. У меня более 300 тыс. строк, и только один регион покрывает около 10 тыс. строк.
Откуда вы берете данные для широты и долготы для Кении. Я думаю, вы скачать somehwere? Просто дайте ссылку.
@TarJae Вот ссылка Nationsonline.org/oneworld/country_code_list.htm и эта статья поможет в скачивании rpubs.com/spoonerf/countrymapggplot2
Без ваших данных это немного сложно сделать правильно. Вы можете поэкспериментировать примерно так:
Сначала создайте фрейм данных меньшего размера только для geom_text()
.
new_df<- Kenya1_df %>%
dplyr::group_by(NAME_1) %>%
dplyr::summarise(long=mean(long),
lat = mean(lat)
)
ggplot() +
geom_polygon(data = Kenya1_df, aes(x = long, y = lat, group = group, fill =
count), color = "black", size = 0.25) +
theme(aspect.ratio=1)+
scale_fill_distiller(name = "Count", palette = "Reds", breaks = pretty_breaks(n = 5))+
geom_text(data=new_df, aes(label = NAME_1, x = long, y = lat))+
labs(title = "Nice Map")
Как насчет того, чтобы я предоставил эту ссылку, чтобы помочь вам загрузить данные о стране. Вот ссылка на скачивание картографических данных Nationsonline.org/oneworld/country_code_list.htm и эта статья поможет в загрузке rpubs.com/spoonerf/countrymapggplot2. Таким образом, после загрузки мы предполагаем, что только 5 округов имеют данные для построения или раскрашивания.
Я получаю эту ошибку после запуска этого Aesthetics must be either length 1 or the same as the data (1): label
Я пересмотрел свой ответ, данные могут отличаться от ваших.
Проблема в том, что вы наносите имя на каждую вершину каждого многоугольника на вашем изображении. Вам нужно нанести одно имя в центр тяжести каждого региона. Я считаю, что проще работать с объектами sf
, если вы хотите это сделать, но преобразовать фрейм данных в один из них просто:
library(ggplot2)
Kenya1_df<- sf::st_as_sf(Kenya1_df)
ggplot(Kenya1_df) +
geom_sf(aes(fill = count)) +
geom_sf_label(data = sf::st_centroid(subset(Kenya1_df, !is.na(count))),
aes(label = NAME_1)) +
scale_fill_distiller(name = "Count", palette = "Reds",
breaks = scales::pretty_breaks(n = 5))
Используемые данные
Очевидно, у нас нет ваших данных о подсчете, поэтому вот как я воссоздал что-то похожее на ваше:
Kenya1_df <- raster::getData("GADM", country = "KE", level = 1)
Kenya1_df$count <- NA
regions <- c("Kajiado", "Kitui", "Tana River", "Garissa", "Wajir", "Mandera",
"Homa Bay", "Meru", "Murang'a", "Nyeri", "Kiambu", "Nairobi",
"Machakos", "Nakuru", "Elgeyo-Marakwet")
values <- c(150, 150, 1000, 1900, 500, 150, 150,
150, 150, 150, 500, 750, 500, 150, 150)
Kenya1_df$count[match(regions, Kenya1_df$NAME_1)] <- values
Похоже на умное решение. Быстрый, почему я получаю эту ошибку при преобразовании моих данных в sf Error in st_sf(x, ..., agr = agr, sf_column_name = sf_column_name) : no simple features geometry column present
@LivingstoneM вам нужно преобразовать в sf перед преобразованием фрейма данных SpatialPolygons в «обычный» фрейм данных. т. е. получите данные карты, выполните левое соединение (или, тем не менее, вы сопоставляете количество с регионами), но не используйте as.data.frame
, прежде чем конвертировать в sf
Это дикая догадка, но попробуйте
unique
: geom_text(aes(label =unique(Kenya1_df$NAME_1), x = Kenya1_df$long, y = Kenya1_df$lat))+