В igraph в R возможно ли создать пунктирные линии вокруг объектов вершин? - PullRequest
6 голосов
/ 24 октября 2019

В igraph в R, у меня в настоящее время есть график, похожий на:

enter image description here

, который был сделан из кода:

g <- make_undirected_graph(edges = c(1, 3, 2, 1, 2, 4, 3, 4, 4, 5), n = 5)

Я бы хотел вместо этого пунктирными линиями на вершинах, которые являются кругами. Существует опция edge.label, но нет опции vertex.label. Есть ли другой способ сделать это? спасибо.

Ответы [ 3 ]

5 голосов
/ 26 октября 2019

Вы можете определить свои собственные фигуры: https://igraph.org/r/doc/shapes.html, а пример точки с пунктирной границей дан на https://r.789695.n4.nabble.com/Drawing-a-dotted-circle-td4655331.html. Полный пример создания новой фигуры на https://lists.gnu.org/archive/html/igraph-help/2013-03/msg00030.html. Также см. Больше примеров на ?add_shape. Приведенный ниже пример настраивает код из lists.gnu.org для объединения всего.

Функция для создания новой igraph фигуры

myimg <- function(coords, v=NULL, params) {
  vertex.color <- params("vertex", "color")
  if (length(vertex.color) != 1 && !is.null(v)) {
    vertex.color <- vertex.color[v]
  }
  vertex.size  <- 1/200 * params("vertex", "size")
  if (length(vertex.size) != 1 && !is.null(v)) {
    vertex.size <- vertex.size[v]
  }
  vertex.frame.color <- params("vertex", "frame.color")
  if (length(vertex.frame.color) != 1 && !is.null(v)) {
    vertex.frame.color <- vertex.frame.color[v]
  }
  vertex.frame.width <- params("vertex", "frame.width")
  if (length(vertex.frame.width) != 1 && !is.null(v)) {
    vertex.frame.width <- vertex.frame.width[v]
  }
  ltype <- params("vertex", "ltype")
  if (length(ltype) != 1 && !is.null(v)) {
    ltype <- ltype[v]
  }   

  mapply(coords[,1], coords[,2], vertex.color, vertex.frame.color,
         vertex.size, vertex.frame.width, ltype, 
         FUN=function(x, y, bg, fg, size, lwd, lty) {
           symbols(x=x, y=y, bg=bg, fg=fg, lwd=lwd, lty=lty,
                   circles=size, add=TRUE, inches=FALSE)
         })
  }

Затем вы заставляете igraph распознавать фигуру, используя add_shape. Вы устанавливаете значения параметров по умолчанию с помощью аргумента parameters.

library(igraph)

g <- make_undirected_graph(edges = c(1, 3, 2, 1, 2, 4, 3, 4, 4, 5), n = 5)

add_shape("myimg",  plot=myimg, 
          parameters = list(
            vertex.frame.color=1, 
            vertex.frame.width=1,
            vertex.ltype=1))

Затем строите график

plot(g,  vertex.shape="myimg", 
         vertex.frame.color=1:5, 
         vertex.frame.width=5, 
         vertex.ltype=1:5,
         vertex.color=6:10,
         vertex.size=seq(50, 80, length=5))

Чтобы получить все границы пунктирными, используйте vertex.ltype="dotted" или vertex.ltype=3.

enter image description here

3 голосов
/ 28 октября 2019

Я не использую igraph, но нашел сетевой пакет хорошей заменой, и его функция построения графиков более интуитивна (если вы знакомы с параметрами базового графика) и проще в настройке. Но я на 100% уверен, что вы можете найти аналогичную функцию в igraph, которая позволяет настраивать параметры графика.

require(network)

# build the network
g = as.network.matrix(x = matrix(c(1, 3, 2, 1, 2, 4, 3, 4, 4, 5), nrow = 5, byrow = T), matrix.type = 'edgelist', directed = F)

# vertex.lty is the parameter you are looking for, and you can pass an array to it.
# lty = 2 for dashed lines and lty = 3 for dotted lines.
plot(g, label = 1:5, label.pos = 5, 
     vertex.cex =6, vertex.col = "#ffdd88",
     vertex.lty = c(1,2,2,3,3), vertex.lwd = c(2,3,4,2,3)) 

enter image description here

(отредактировано для улучшенияформатирования.)

3 голосов
/ 26 октября 2019

Я не уверен, как это сделать в igraph, но один из вариантов - распечатать его, используя ggraph, пакет, соединяющий igraph с ggplot2. Затем мы можем построить график в слоях и указать внешний вид каждого из них:

library(ggraph)
ggraph(g) +
  geom_edge_link(color = "gray60") +
  geom_node_circle(aes(r = 0.1), lty = "dashed", fill = "orange") +
  geom_node_text(aes(label = ggraph.orig_index)) +
  coord_equal() +
  theme_void()

enter image description here

...