Да, это возможно с помощью 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](https://i.stack.imgur.com/UpUoO.png)
Также, следуя комментарию @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](https://i.stack.imgur.com/uUtz6.png)