【问题标题】:Dataframe for visNetwork/igraphvisNetwork/igraph 的数据框
【发布时间】:2018-10-24 10:39:29
【问题描述】:

我正在处理一些航运数据,其中包含有关船舶航行的信息。每个航次都有自己的 ID,通常一艘船在某个港口开始航行,在同一个或不同的港口装载货物,然后在某个港口卸货。有时,船舶可能还必须在港口等待装卸货物。此外,船舶可以在多个港口卸货。我的数据集的前 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))

我正在尝试使用 R 中的 visNetworkigraph 包将此信息可视化为网络图。但是为了做到这一点,我想将 PortName 变量分成 From 和 @987654327 @ 变量并维护端口函数的属性,即。开始、装载、等待或卸货。我徒劳地尝试使用 for 循环通过迭代每个唯一的 Voyage ID 来实现这一点。不值得分享损坏的代码。任何指示或建议都会有所帮助。

【问题讨论】:

  • PortName分成FromTo背后的逻辑是什么?
  • 在使用visNetwork 时,我需要一个节点数据框和一个边数据框。对于边缘数据框,我需要有fromto 列,如此处所述datastorm-open.github.io/visNetwork
  • 对,但是您如何确定数据集中的 fromto。没有fromto 列,那么确定合适的from-to 对的逻辑是什么?
  • 就像我提到的,航程从出发港开始,到装货港再到卸货港。因此,如果您查看航程 ID 1656,该船从 BELLEDUNE 开始,然后在 PORT CARTIER 装载,最后在 IMMINGHAM 卸货。所以from 将包含 BELLEDUNE、PORT CARTIER,而to 中的对应值将是 PORT CARTIER 和 IMMINGHAM。
  • Voyage 1975 有两个卸货节点。我们可以假设订单是由ord_no_int 给出的吗?也就是说,这艘船从拉斯佩齐亚到富西纳? 1228 号航程在切萨皮克开始并装载。你想要一个从切萨皮克到它自己的链接吗?

标签: r igraph visnetwork


【解决方案1】:

我将您在问题中提供的数据加载到名为 Voyage 的 data.frame 中。假设您的数据按示例中的方式排序(行程的一部分是连续且按顺序排列的),我们只需要链接与下一行具有相同 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)

【讨论】:

  • 感谢您的回复。这绝对看起来像我可以使用的东西。将探索如何为节点和边缘添加美感。
【解决方案2】:

以下强制按Fkey_Dim_Voyage_Idord_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 时会发生什么。

【讨论】:

  • 感谢您的回复,但我收到错误消息 Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : arguments imply differing number of rows: 1, 10 In addition: Warning messages: 1: In graph_from_data_frame(x, directed = directed) : In d' NA' elements were replaced with string "NA" 2: In if (class(newval) == "factor") { : the condition has length > 1 and only the first element will be used 3: In if (class(newval) == "factor") { : the condition has length > 1 and only the first element will be used
  • 我对@9​​87654332@ 和ggraph 不熟悉,但它们看起来确实像我应该学习的包。再次感谢。
猜你喜欢
  • 2022-07-04
  • 2019-06-17
  • 1970-01-01
  • 2018-03-21
  • 2018-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
相关资源
最近更新 更多