Изобразить структуры сети поставок - PullRequest
0 голосов
/ 14 ноября 2018

Я хотел бы построить структуру сети поставок. Я пытался использовать igraph, но до сих пор не придумал разумного результата. Пример будет выглядеть так:

library(igraph)
d <- read.table(text = "V1 V2 weight
            s1  p1  88
            s3  p1  100
            s2  p2  100
            s3  p2  43
            p1  c1  21
            p1  c2  79
            p1  c3  88
            p2  c1  22
            p2  c2  121
            ", stringsAsFactors = F, header = T)

g <- graph_from_data_frame(d, directed = T)
plot(g, layout=layout.fruchterman.reingold,
     edge.width=E(g)$weight/20,
     vertex.shape = "none", vertex.label.font = 2,
     vertex.label.cex=1.1, edge.color="gray70")   

Что дает:

enter image description here

Проблема в том, что сеть имеет дополнительную структуру. Резонансный, среди прочего, результат показал бы, что s-узлы (для поставщиков) должны быть в левой трети, p-узлы (заводы) должны быть посередине, а c-узлы (клиенты) на Правая сторона. Это вообще выполнимо с igraph (и как)? Есть ли другой пакет, который мог бы сделать это?

1 Ответ

0 голосов
/ 14 ноября 2018

Да, это возможно с помощью igraph.Один из способов сделать свой собственный макет.Простой способ сделать это - поместить все узлы "s" в x = 1, узлы "p" в x = 2 и узлы "c" в x = 3.Каждый отдельный узел каждого типа (s, p, c) должен получить уникальное значение y, чтобы они не перекрывались.Используя пример вашего графика:

LO = matrix(0, nrow=vcount(g), ncol=2)
LO[grep("s", V(g)$name), 1] = 1
LO[grep("p", V(g)$name), 1] = 2
LO[grep("c", V(g)$name), 1] = 3
LO[,2] = ave(rep(1, vcount(g)), LO[,1], FUN = seq_along) 

plot(g, layout=LO, edge.width=E(g)$weight/20, 
     vertex.shape = "none", vertex.label.font = 2,
     vertex.label.cex=1.1, edge.color="gray70") 

Tripartite Graph

Также, следуя комментарию @Henrik, вы можете использовать layout_with_sugiyama.Вам все еще нужно определить (s, p, c) -слой.Также сугияма размещает слои вертикально.Вам нужно поменять координаты x и y, чтобы получить горизонтальное расположение.

Layers = rep(0,vcount(g))
Layers[grep("s", V(g)$name)] = 3
Layers[grep("p", V(g)$name)] = 2
Layers[grep("c", V(g)$name)] = 1
LO2 = layout_with_sugiyama(g, layers=Layers)$layout
LO2 = LO2[,2:1]

plot(g, layout=LO2, edge.width=E(g)$weight/20, 
     vertex.shape = "none", vertex.label.font = 2,
     vertex.label.cex=1.1, edge.color="gray70") 

Sugiyama layout

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...