igraph:定位标签并删除网格布局中的空白空间

Sat*_*atu 6 plot r directed-graph igraph

我想创建一个函数,绘制有顶点对齐的有向图,并在每个顶点下面添加一些文本,即类似下面的示例图.绘图功能应该能够将饼图处理为顶点,所以我igraph在R中使用了包.

adjm <- matrix(c(0,1,0,1,
                 0,0,1,1,
                 0,0,0,1,
                 0,0,0,0), nrow=4, byrow=TRUE)

g1 <- graph.adjacency(adjm, mode="directed")

values <- lapply(1:4, function(x) sample(1:4,4))

windows(width=7, height=3.5)

plot(g1, layout=layout.grid(g1, width=4), 
     vertex.shape="pie", vertex.pie=values,
     vertex.pie.color=list(heat.colors(4)),
     edge.curved=TRUE,
     vertex.label=LETTERS[1:4], vertex.size=50,
     vertex.label.dist=5, vertex.label.degree=pi/2, 
     edge.label=1:5, rescale=FALSE, 
     xlim=c(-0.2,3.5), ylim=c(0,0.5))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我有两个问题.

  1. 为什么顶点标签越长,到顶点中心的距离越长,如下例所示?我可以强制它们出现在同一级别而无需手动查找并定义它们正确的距离吗?

    windows(width=7, height=3.5)
    
    plot(g1, layout=layout.grid(g1, width=4), 
         vertex.shape="pie", vertex.pie=values,
         vertex.pie.color=list(heat.colors(4)),
         edge.curved=TRUE,
         vertex.label=c("A", "AA", "AAAA", "AAAAAA"), vertex.size=50,
         vertex.label.dist=5, vertex.label.degree=pi/2, 
         edge.label=1:5, rescale=FALSE, 
         xlim=c(-0.2,3.5), ylim=c(0,0.5))
    
    Run Code Online (Sandbox Code Playgroud)

    在此输入图像描述

  2. 绘制对齐图时如何删除空白区域?如果我制作一个水平图形,它将被放置在窗口的底部,有很多空的空间.图像越平坦,图形越小,如第三个图中所示.(似乎确定了图形的大小,使得图形适合任何位置,垂直或水平.)

    plot(g1, layout=layout.grid(g1, width=4), 
         vertex.shape="pie", vertex.pie=values,
         vertex.pie.color=list(heat.colors(4)),
         edge.curved=TRUE,
         vertex.label=c("A", "AA", "AAAA", "AAAAAA"), vertex.size=20,
         vertex.label.dist=2, vertex.label.degree=pi/2, edge.label=1:5)
    
    Run Code Online (Sandbox Code Playgroud)

    在此输入图像描述 我可以编写参数asp=0来保持顶点在平坦窗口中的正确尺寸,但自动曲率和顶点标签的位置会发生变化.我可以手动调整负上边距,标签距离和边缘曲率,但当然这不是通用函数的解决方案.到目前为止,最好的结果是rescale=FALSE第一个绘图的代码中的结果,但边缘曲率仍然太小,并且顶点越大,它们完全位于顶点后面.(另外,顶点标签距离变化的问题仍然存在.)直接使用autocurve.edges并没有给我任何曲率.接下来要尝试什么的想法?

Nic*_*icE 5

要解决此问题,您可能需要plot.igraph稍微调整一下功能。为此,您可以尝试使用trace(plot.igraph,edit=TRUE)并修改该函数的代码。

获得所需内容的一些技巧:对于标签,函数的第319行为:

y <- layout[, 2] + label.dist * sin(-label.degree) * (vertex.size + 6 * 8 * log10(nchar(labels) + 1))/200
Run Code Online (Sandbox Code Playgroud)

因此,y标签的位置与标签的字符数成正比,只需删除即可log10(nchar(labels) + 1),标签将保持在同一水平。

对于大小问题,如果要保留rescale,则将图的y位置定义为第55行

layout <- layout.norm(layout, -1, 1, -1, 1)
Run Code Online (Sandbox Code Playgroud)

您可以将第三个数字更改为所需的任何数字,并且绘图会更高(例如,layout <- layout.norm(layout, -1, 1, 0, 1) will center the vertexes on 0). You can also change the margins by changing thepar`设置。例如,您可以执行以下操作:

oldMargins<-par("mar")
par(mar=c(10,4,4,4))
Run Code Online (Sandbox Code Playgroud)

在剧情之后 par(mar=oldMargins)

这是我在调整后使用此代码得到的图:

在此处输入图片说明

我离开了轴以使其易于调整,并删除了派,因为您的帖子中未提供任何值。

oldMargins<-par("mar")
par(mar=c(10,4,4,4))
plot(g1, layout=layout.grid(g1, width=4),
     vertex.pie.color=list(heat.colors(4)),
     edge.curved=TRUE,
     vertex.label=c("A", "AA", "AAAA", "AAAAAA"), vertex.size=20,
     vertex.label.dist=1, vertex.label.degree=pi/2, edge.label=1:5,axes=TRUE,
     ylim=c(-0.5,0.5),xlim=c(-1,1))
par(mar=oldMargins)
Run Code Online (Sandbox Code Playgroud)

当您重新启动R时,对功能所做的任何更改都将被删除,或者您可以untrace用来返回到原始功能。您可以查看此帖子以获取更多信息。