在R型igraph中,是否可以在顶点对象周围创建虚线?

时间:2019-10-24 14:49:28

标签: r igraph

在R中的igraph中,我目前有一个看起来像这样的图:

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 个答案:

答案 0 :(得分:5)

您可以定义自己的形状: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上的更多示例。下面的示例对list.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

答案 1 :(得分:3)

我不确定如何在igraph中执行此操作,但是一个选择是使用ggraph打印该文件,该软件包将igraphggplot2桥接在一起。然后,我们可以按层构建图形并指定每个图形的外观:

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

答案 2 :(得分:3)

我不使用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

(为获得更好的格式而进行了编辑。)