Маркировка цветной области на карте ggplot

У меня небольшая проблема с маркировкой моей карты 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 округов имеют данные для построения или раскрашивания.

Мой вопрос заключается в том, как я могу пометить и сосредоточиться только на значениях строк с числами в столбце подсчета или есть ли какой-либо другой умный способ маркировки, не искажая видимость вывода карты. Обратите внимание, что не все регионы имеют данные, я хочу сосредоточиться только на тех, у которых есть данные, но при этом есть полная карта.

Это дикая догадка, но попробуйте unique: ​​geom_text(aes(label =unique(Kenya1_df$NAME_1), x = Kenya1_df$long, y = Kenya1_df$lat))+

TarJae 12.02.2023 09:56

@TarJae, Умное предположение, но я получаю эту ошибку Aesthetics must be either length 1 or the same as the data (312417): label

LivingstoneM 12.02.2023 10:00

Я уверен, что нам нужно настроить данные в вашем случае, но я не могу воспроизвести ваш пример. Разбейте его на 10 Name_1, создайте воспроизводимый пример с данными о длинной широте.

TarJae 12.02.2023 10:08

@Tarjae Можете ли вы рассказать мне, что мне нужно сделать, я пытаюсь получить воспроизводимые данные, но это будет сложно. У меня более 300 тыс. строк, и только один регион покрывает около 10 тыс. строк.

LivingstoneM 12.02.2023 10:29

Откуда вы берете данные для широты и долготы для Кении. Я думаю, вы скачать somehwere? Просто дайте ссылку.

TarJae 12.02.2023 10:31
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Без ваших данных это немного сложно сделать правильно. Вы можете поэкспериментировать примерно так:

Сначала создайте фрейм данных меньшего размера только для 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 округов имеют данные для построения или раскрашивания.

LivingstoneM 12.02.2023 11:00

Я получаю эту ошибку после запуска этого Aesthetics must be either length 1 or the same as the data (1): label

LivingstoneM 12.02.2023 11:05

Я пересмотрел свой ответ, данные могут отличаться от ваших.

Zhiqiang Wang 12.02.2023 12:19
Ответ принят как подходящий

Проблема в том, что вы наносите имя на каждую вершину каждого многоугольника на вашем изображении. Вам нужно нанести одно имя в центр тяжести каждого региона. Я считаю, что проще работать с объектами 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 12.02.2023 12:26

@LivingstoneM вам нужно преобразовать в sf перед преобразованием фрейма данных SpatialPolygons в «обычный» фрейм данных. т. е. получите данные карты, выполните левое соединение (или, тем не менее, вы сопоставляете количество с регионами), но не используйте as.data.frame, прежде чем конвертировать в sf

Allan Cameron 12.02.2023 12:37

Другие вопросы по теме