Dataframe для visNetwork / igraph - PullRequest
0 голосов
/ 14 мая 2018

Я работаю с некоторыми данными по отгрузке, которые содержат информацию о рейсах, предпринимаемых судами. Каждый рейс имеет свой собственный идентификатор, и, как правило, судно начинает свой рейс в каком-либо порту, загружает груз в тот же или в другой порт, а затем выгружает его в некоторый порт. Иногда судну также приходится ждать в порту перед погрузкой или выгрузкой груза. Кроме того, судно может выгружать свой груз в нескольких портах. Первые 10 строк моего набора данных, как показано ниже:

structure(list(Fkey_Dim_Voyage_Id = c(1228L, 1228L, 1228L, 1656L, 
1656L, 1656L, 1675L, 1675L, 1675L, 1675L), Imos_VoyNo = c(19L, 
19L, 19L, 16L, 16L, 16L, 7L, 7L, 7L, 7L), ord_no_int = c(100, 
300, 500, 100, 200, 700, 100, 300, 500, 600), Fkey_Dim_PortFunction_Id = c("Commencing", 
"Loading", "Discharging", "Commencing", "Loading", "Discharging", 
"Commencing", "Loading", "Discharging", "Discharging"), PortName = c("CHESAPEAKE", 
"CHESAPEAKE", "IMMINGHAM", "BELLEDUNE", "PORT CARTIER", "IMMINGHAM", 
"AUGHINISH", "NORFOLK", "LA SPEZIA", "FUSINA"), Fkey_Dim_Vessel_Id = c(1179L, 
1179L, 1179L, 144L, 144L, 144L, 1124L, 1124L, 1124L, 1124L), 
    Date_Arrival = structure(c(978307200, 1511927640, 1513400760, 
    978307200, 1510578000, 1511956800, 978307200, 1511611260, 
    1513713600, 1515225600), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    Date_Departure = structure(c(1511945640, 1512267840, 1516425480, 
    1510489380, 1510765200, 1513359300, 1510665120, 1512283320, 
    1514903400, 1515664800), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    Latitude = c(36.45, 36.45, 53.38, 47.54, 50, 53.38, 52.38, 
    36.51, 44.06, 45.25), Longitude = c(-76.15, -76.15, -0.11, 
    -65.45, -66.47, -0.11, -9.03, -76.18, 9.49, 12.16)), row.names = c(NA, 
-10L), class = c("grouped_df", "tbl_df", "tbl", "data.frame"), vars = c("Fkey_Dim_Voyage_Id", 
"Imos_VoyNo"), drop = TRUE, indices = list(0:2, 3:5, 6:9), group_sizes = c(3L, 
3L, 4L), biggest_group_size = 4L, labels = structure(list(Fkey_Dim_Voyage_Id = c(1228L, 
1656L, 1675L), Imos_VoyNo = c(19L, 16L, 7L)), row.names = c(NA, 
-3L), class = "data.frame", vars = c("Fkey_Dim_Voyage_Id", "Imos_VoyNo"
), drop = TRUE))

Я пытаюсь визуализировать эту информацию в виде сетевого графика, используя пакеты visNetwork или igraph в R. Однако для этого я хочу разделить переменную PortName на From и * 1008. * Переменные и поддерживать атрибуты функции порта, а именно. Начало, загрузка, ожидание или выгрузка. Я тщетно пытался использовать цикл for для достижения этой цели путем перебора каждого уникального идентификатора рейса. Не стоит делиться сломанным кодом. Любые указатели или предложения будут полезны.

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Следующие операции принудительной предварительной сортировки по Fkey_Dim_Voyage_Id и ord_no_int, которые должны включить генерацию чистого графика:

library(ggraph)
library(tidygraph)
library(tidyverse)

df %>%
  group_by(Fkey_Dim_Voyage_Id) %>%
  arrange(Fkey_Dim_Voyage_Id, ord_no_int) %>%
  mutate(from = PortName,
         to = lead(PortName)) %>%
  rename(PortFunction = Fkey_Dim_PortFunction_Id) %>%
  as_tbl_graph(directed = TRUE) %>%
  ggraph(., layout = 'linear', circular = TRUE) +
  geom_edge_fan(aes(start_cap = circle(4, 'mm'),
                    end_cap = circle(4, 'mm'),
                    color = PortFunction),
                 arrow = arrow(length = unit(4, 'mm'))) +
  geom_node_text(aes(label = name), size = 3) +
  geom_edge_loop(aes(color = PortFunction),
                 arrow = arrow(length = unit(4, 'mm'))) +
  coord_fixed(ratio = 3/5) +
  theme_graph()

Используя tidygraph + ggraph, вы сможете гибко представлять и добавлять эстетику в узлы и ребра. Например, посмотрите, что происходит, когда вы переходите с geom_edge_fan на geom_edge_link.

Network Graph

0 голосов
/ 14 мая 2018

Я загрузил данные, которые вы указали в вопросе, в data.frame с именем Voyage.Предполагая, что ваши данные отсортированы, как в примере (части поездки расположены последовательно и по порядку), нам просто нужно связать порты для записей, которые имеют тот же Fkey_Dim_Voyage_Id, что и следующая строка.

library(igraph)

Leg = which(Voyage$Fkey_Dim_Voyage_Id[-1] == head(Voyage$Fkey_Dim_Voyage_Id, -1))

FROM = Voyage$PortName[Leg]
TO   = Voyage$PortName[Leg+1]

Routes = data.frame(FROM, TO)

G = graph_from_data_frame(Routes)
plot(G)

Shipping Routes

...