2013-11-17 1 views
1

мне нужно построить ориентированные ациклические решетки график размера MXN, аналогичен, как и в этой картине, но без ребер на контуре и без вершин по углам:Как построить ориентированный ациклический решетчатый граф в R

enter image description here

Это можно сделать с graph.lattice функция? Если да, как установить такие метки меток (т. Е. (X, y), а не только целое число) и удалить упомянутые ребра и вершины? Кроме того, возможно ли построить график в таком положении (как на картинке) без использования функции tkplot и затем его вращать?

ответ

1

Я не совсем уверен, что вы имеете в виду под «без ребер на контуре», но вот некоторые моменты:

  • Read ?igraph.plotting для полного списка планировавших параметров.
  • Если вы не хотите кадр на вершинах, установите vertex.frame.color на то же значение, что и vertex.color.
  • Использование layout.grid, см. ?layout.grid.
  • Используйте vertex.label для установки этикеток.
  • Если вы хотите опустить некоторые ребра, удалите их или установите их ширину в ноль или их цвет на цвет фона.
  • Если вы хотите опустить некоторые вершины, то приложите координаты, вычисленные layout.grid как атрибуты вершины, а затем удалите вершины из графика.

Что-то подобное может работать:

g <- graph.lattice(c(5,5)) 
lay <- layout.grid(g) 
V(g)$x <- lay[,1] 
V(g)$y <- lay[,2] 
V(g)$color <- V(g)$frame.color <- "darkolivegreen" 
V(g)$label.color <- "lightgrey" 
V(g)$label <- paste(V(g)$x+1, V(g)$y+1, sep=",") 

Чтобы удалить ребра, вы можете выбрать их на основе координат вершин:

torem <- c(E(g)[ V(g)[x==0] %--% V(g)[x==0] ], 
      E(g)[ V(g)[y==0] %--% V(g)[y==0] ], 
      E(g)[ V(g)[x==4] %--% V(g)[x==4] ], 
      E(g)[ V(g)[y==4] %--% V(g)[y==4] ]) 
g2 <- delete.edges(g, torem) 

, а затем удалить вершины и участок :

g3 <- delete.vertices(g2, V(g2)[ x %in% c(0,4) & y %in% c(0,4) ]) 
plot(g3, layout=cbind(V(g3)$x, V(g3)$y)) 

plot

+0

Благодарим за ответ. «Без ребер на контуре» я имел в виду, как удалять ребра, которые находятся на контуре сетки (сетка перед удалением угловых вершин), т. Е. Как удалять ребра (2,1) - (3,1), (3 , 1) - (4,1), (1,2) - (1,3), (1,3) - (1,4) и т. Д.? В этот момент я использую функцию delete.edges и просто называю индексы, но это не сработает для больших графиков. – user3001385

+0

См. Отредактированный ответ. –

+0

Кроме того, можно ли покрасить «квадраты», ограниченные краями разных цветов на этом изображении? Например, в зону цвета, ограниченную (2,2) - (2,3), (2,3) - (3,3), (3,3) - (3,2), (2,2) - (3,2) в одном цвете, а другая такая область в другом цвете? Могу ли я это сделать, установив параметр mark.col каким-то образом? – user3001385