Нарисуйте линию между 2 почтовый индекс на карте США в R - PullRequest
0 голосов
/ 26 января 2020

Я пытался нарисовать прямую линию, соединяющую 2 почтовых индекса в США. До сих пор я был в состоянии только построить точки каждого почтового индекса в США, но не могу провести границу между ними

Вот как выглядят мои данные. Я пытаюсь нарисовать 8 точек на карте США и соединить их 4 линиями. Я попытался использовать zip.plot, но он будет показывать только точки, а не рисовать линию

df1 <- data.frame(trip = c(1,2,3,4), zip1 = c(55803,87112,55107,66006), zip2=c(12909,93703,12205,78210))

df1
  trip  zip1  zip2
1    1 55803 12909
2    2 87112 93703
3    3 55107 12205
4    4 66006 78210

1 Ответ

0 голосов
/ 26 января 2020

Посмотрите на код для функции zip.plot, и вы увидите, что это просто. Он объединит данные вашего почтового индекса с данными долготы и широты data(zips). Вы заметите, что он строит точки, но не имеет функции для их соединения, и не возвращает построенные точки.

Вы можете адаптировать аналогичную функцию, которая соответствует вашим потребностям. Если вы включите library(muRL), вы можете загрузить zip-данные на data(zips). После построения точек можно добавить линии для их соединения на основе переменной trip.

Например, создать новую функцию zip.plot.new:

library(muRL)
data(zips)

zip.plot.new <- function(data, map.type = "state", ...){
  data.z <- merge(data, zips[,c("zip", "lat", "lon")], by.x = "zip", by.y = "zip", all.x = TRUE)
  maps::map(map.type, ...)
  points(data.z$lon, data.z$lat, cex = 1, col = "black", pch = 20)
  mapply(lines, split(data.z$lon, data.z$trip), split(data.z$lat, data.z$trip))
}

Сюда входит mapply(lines... чтобы соединить точки с помощью trip.

Затем вы можете использовать свой фрейм данных, преобразовать в более длинную форму и вызвать эту новую функцию:

library(tidyverse)

df1 %>%
  pivot_longer(cols = starts_with("zip_"), names_to = c(".value", "group"), names_sep = "_") %>%
  zip.plot.new(.)

zip code plot

Обратите внимание, что почтовый индекс 12909 не был сопоставлен в данных (кажется недействительным?).

Данные

df1 <- data.frame(trip = c(1,2,3,4), 
                  zip_1 = c("55803","87112","55107","66006"), 
                  zip_2 = c("12909","93703","12205","78210"))

Редактировать : Вот ggplot версия:

library(ggmap)
library(maps)
library(ggplot2)
library(tidyverse)

MainStates <- map_data("state")

point_data <- df1 %>%
  pivot_longer(cols = starts_with("zip_"), names_to = c(".value", "group"), names_sep = "_") %>%
  mutate(zip = factor(zip, levels = levels(zips$zip))) %>%
  left_join(zips) 

ggplot() + 
  geom_polygon(data=MainStates, aes(x=long, y=lat, group=group), color = "black", fill = "white") +
  geom_point(data = point_data, aes(x = lon, y = lat, group = trip)) +
  geom_line(data = point_data, aes(x = lon, y = lat, group = trip)) +
  coord_fixed(1.3) +
  theme_nothing()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...