Как условно добавить метки к точкам на карте города с помощью ggmap

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

Данные

name |s  Latitude |s Longitude |s Frequency

Pelham Bay Park | 40.865556 | -73.808333 | 32

Greenbelt        | 40.58846 | -74.139073  | 10

Van Cortlandt Park | 40.8978 | -73.8839 | 3

Flushing Meadows–Corona Park | 40.745833 | -73.844722 | 5

Central Park | 40.783333 | -73.966667 |22

Код

library(ggmap)
town <- get_map(location = "New York", zoom = 10)

mapPoints <- ggmap(town) + 
  geom_point(aes(x = work_count$Longitude, y = work_count$Latitude, size = work_count$Frequency), data = work_count, alpha = .5) +
geom_text(aes(label=ifelse(work_count$Frequency>quart(work_count$Frequency)[2],as.character(work_count$name),'')),hjust=0,vjust=0)

quart <- function(x) {
  x <- sort(x)
  n <- length(x)
  m <- (n+1)/2
  if (floor(m) != m) {
     l <- m-1/2; u <- m+1/2
  } else {
     l <- m-1; u <- m+1
   }
   c(Q1=median(x[1:l]), Q3=median(x[u:n]))
 }
mapPoints

Я получаю следующую ошибку: Ошибка: Эстетика должна быть либо длиной 1, либо такой же, как данные (5): метка, x, y Любая помощь приветствуется


person bob jones    schedule 12.08.2016    source источник
comment
Вам будет легче помочь с построением вопросов, если вы предоставите воспроизводимый пример с примерами входных данных, чтобы мы могли запустить ваш код, чтобы увидеть, что не так, и протестировать возможные решения.   -  person MrFlick    schedule 12.08.2016
comment
Возможно, вы захотите предварительно обработать метки, а не вычислять их на лету в geom_text, то есть work_count$labels <- ifelse(work_count$Frequency>quart(work_count$Frequency)[2],as.character(work_count$name),'')), а затем передать это в geom_text.   -  person Weihuang Wong    schedule 12.08.2016
comment
@Weihuang Wong Я сделал и получил столбец, в котором существуют только записи, соответствующие моим критериям, а остальные пусты. И я передал work_count$labels в поле метки в geom_text, но не смог получить вывод   -  person bob jones    schedule 12.08.2016
comment
См. комментарий выше о предоставлении воспроизводимого примера. Например. покажите код, который вы использовали для создания town, и выполните dput(head(work_count, 20)) и вставьте вывод в свой вопрос, чтобы показать нам первые несколько строк ваших данных.   -  person Weihuang Wong    schedule 12.08.2016
comment
Поскольку аргумент данных в geom_XXX, вам не нужно указывать фрейм данных в aes. Это может не решить вашу проблему, но сделает ваш код намного чище. dput гораздо полезнее, чем распечатка вашей таблицы   -  person Richard Telford    schedule 12.08.2016
comment
Ваша функция quart выглядит как сложная альтернатива quantile   -  person Richard Telford    schedule 13.08.2016
comment
Я не проверял это, но думаю, что geom_text() нужен фрейм данных с именем: data = work_count, как вы сделали для geom_point()   -  person Sandy Muspratt    schedule 13.08.2016
comment
Кроме того, geom_text не знает, куда ставить ярлыки.   -  person Sandy Muspratt    schedule 13.08.2016
comment
Кое-как я разобрался. work_count$labels ‹- ifelse(work_count$Frequency ›(кварт(work_count$Frequency)[2] + 1.5*IQR(work_count$Frequency)),as.character(work_count$name),'') mapPoints ‹- ggmap(город ) + geom_point(aes(x = work_count$Longitude, y = work_count$Latitude, size = work_count$Frequency), data = work_count, alpha = .5) + geom_text(data = work_count, aes(x = долгота, y = широта , label = work_count$labels), size = 3, color = red)' Я не разобрался с текстом и ярлыком. Каково предполагаемое значение для hjust и vjust.   -  person bob jones    schedule 13.08.2016
comment
Этот меня сильно раздражает. Казалось, что это сработало, и снова выдает мне ошибку: эстетика должна быть либо длиной 1, либо такой же, как данные (5): метка, x, y   -  person bob jones    schedule 13.08.2016


Ответы (1)


Кажется, это работает.

work_count$lab <- ifelse(work_count$Frequency>quart(work_count$Frequency)[2],
  as.character(work_count$name), '')

mapPoints <- ggmap(town, 
                   base_layer = ggplot(work_count, 
                     aes(x = Longitude, y = Latitude))) +
  geom_point(aes(size = Frequency), 
             alpha = .5) +
  geom_text(aes(label = labels), 
            vjust = 0,
            hjust = 0)
mapPoints

введите здесь описание изображения

person Weihuang Wong    schedule 12.08.2016
comment
Спасибо. 'ggmap(город, базовый_слой = ggplot(data=work_count, aes(x = долгота, y = широта, label=метки)) + geom_point(fill = черный, альфа = 0,8, aes(x = work_count$долгота, y = work_count$Latitude, size = work_count$Frequency), shape = 21) + geom_text() тоже получил ответ. Знаете ли вы, как динамически подогнать зум для переменной города, если мы работаем сразу с несколькими городами и одним входом? - person bob jones; 13.08.2016
comment
Действительно, гораздо удобнее указать data и aes() в ggmap(..., base_layer=ggplot(...)). Я отредактировал свой ответ, чтобы отразить это. (Кроме того, как упоминали другие люди выше, вам не нужны все эти work_count$... в ваших геометриях после того, как вы указали данные либо в ggplot(data=...), либо в geom_*(data=...).) Ваш вопрос о динамическом масштабировании - это отдельный вопрос! - person Weihuang Wong; 13.08.2016
comment
Как в этом случае пометить другим цветом только те точки, которые удовлетворяют условию, по сравнению с остальными. В данном случае для Pelham Bay Park. - person bob jones; 17.08.2016