【问题标题】:How to draw a directed network graph with texts on both sides of edges in R (via iGraph, network or some other package)?如何在 R 中(通过 iGraph、network 或其他包)绘制带有文本的有向网络图?
【发布时间】:2017-03-08 15:12:56
【问题描述】:

如何在 R 中绘制带有文本的有向网络图(通过 iGraph、network 或其他包)?

变量(在向量自回归模型 (VAR) 中)位于节点中。

格兰杰因果关系(F 统计量的 p 值)位于边的两侧。我将 p 值放在每个箭头的开头。我强调了近乎显着的因果关系。

我不知道如何通过 iGraph 或网络包或其他方式获得这样的网络图。

【问题讨论】:

    标签: r text graph label igraph


    【解决方案1】:

    阅读documentation on the igraph plot function 似乎没有很多选项来操作边标签,但您可以使用 label.dist 和 label.degree 来操作顶点标签。 你可以这样做:

    g <- graph.empty(n = 3) 
    g <- graph(c(1, 2, 3, 2, 1, 3), directed = TRUE)
    labels <- c("A", "B", "C", "D", "E", "F")
    coords <- matrix(c(1, 1, 2, 2, 3, 3), nrow = 3)
    plot(g, layout = coords, vertex.label = labels, vertex.label.dist = 3.5, vertex.label.degree = c(-pi/4, pi/2, pi, -pi/2, 0, 3*pi/4))
    

    Graph

    【讨论】:

    • 谢谢,真的很有帮助。或许,根据你的代码,可以很容易的得到图中完整的网络图。
    • 以上代码将 vertex.label 对象用于其他目的。但是,如何强加节点名称(即上面的 kur1f、lnbist1f、lnaltin、mfaiz1f)?!!
    【解决方案2】:

    您可以同时使用edge.labelvertex.label 选项。

    library(igraph)
    el <- data.frame(sender = c("lnbist1f","lnbist1f","lnbist1f",
                                "kur1f","kur1f","kur1f",
                                "lnaltin","lnaltin","lnaltin",
                                "mfaiz1f","mfaiz1f","mfaiz1f"),
                     receiver = c("mfaiz1f","lnaltin","kur1f",
                                  "lnbist1f","lnaltin","mfaiz1f",
                                  "mfaiz1f","lnbist1f","kur1f",
                                  "lnbist1f","lnaltin","kur1f"),
                     pval = c(0.5,0.6,0.1, #I just typed random p-vals here
                              0.45,0.88,0.24,
                              0.12,0.51,0.99,
                              0.001,0.056,0.123)
                     )
    arrows = c(2,1,0,0,1,1,1,0,0,2,1,1)
    el <- as.matrix(el)
    g <- graph_from_edgelist(el[,1:2], directed = T)
    coordinates <- matrix(c(4, 4, 1, 1, 4, -2,7,1), nrow = 4, byrow=TRUE)
    plot(g, edge.label=el[,3], 
         vertex.shape="crectangle", 
         vertex.size=45,
         edge.arrow.mode=arrows,
         layout = coordinates)
    

    edge.arrow.mode 可让您控制箭头。您可以使用edge.label.yedge.label.x 选项移动边缘标签。

    【讨论】:

    • 谢谢,paqmo。这个数字正是我想要的。不幸的是,作为图形构造的新手,我无法获得该数字。您能否在此处指定代码中的 g 对象:plot(g, edge.label=el[,3], vertex.shape="crectangle", vertex.size=45, edge.arrow.mode=el[,4])。在缓冲区中,我有 Carlos 的 g。
    • @ErdoganCEVHER。糟糕,g 应该是从边缘列表创建的图形对象——忘记包含该代码。我已经更新了答案以包含它。
    • 我将您的 g 定义 (g &lt;- graph_from_edgelist(el[,1:2], directed = ) 中缺少的部分填写为 g &lt;- graph_from_edgelist(el[,1:2], directed=TRUE)。然后我在情节之前添加了coordinates &lt;- matrix(c(4, 4, 1, 1, 4, -2,7,1), nrow = 4, byrow=TRUE)。而且,在情节中,我添加了情节(.....,布局=坐标)。这样我就得到了你的菱形网图。现在,即使我在 g 定义中设置了“directed=TRUE”,也只丢失了箭头。
    • 似乎是edge.arrow.mode 选项如何读取矩阵的问题。将向量分配给一个对象并使用它——它对我有用。
    • 宾果游戏,它经过了一些小修改。请删除el &lt;- .....0.123),)中多余的逗号,删除后,我将接受它作为答案。否则,它会给出错误:Error in el[, 3] : subscript out of bounds。非常感谢。确实做得很好。
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2017-03-18
    相关资源
    最近更新 更多