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

标签 r plot igraph directed-graph

我想创建一个函数来绘制顶点对齐的有向图并在每个顶点下方添加一些文本,即类似于下面的示例图。绘图函数应该能够将饼图作为顶点处理,所以我使用了 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))

enter image description here

我有两个问题。
  • 为什么顶点标签越长,到顶点中心的距离就越长,如下例所示?我可以强制它们出现在同一级别而无需手动查找和定义它们的正确距离吗?
    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))
    

    enter image description here
  • 绘制对齐的图时如何删除空白空间?如果我制作一个水平图,它将被放置在有很多空白空间的窗口底部。图像越平坦,图形越小,如第三个图所示。 (似乎图形的大小是这样确定的,以便该图适合任何位置,垂直或水平。)
    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)
    

    enter image description here
    我可以写论据 asp=0使顶点在更平坦的窗口中保持正确的大小,但自动曲率和顶点标签的位置会发生变化。我可以手动调整负上边距、标签距离和边缘曲率,但这当然不是通用函数的解决方案。迄今为止最好的结果是rescale=FALSE的结果与第一个图的代码一样,但边缘曲率仍然太小,并且顶点较大时,它们完全位于顶点后面。 (此外,顶点标签距离变化的问题仍然存在。)直接使用 autocurve.edges没有给我任何曲率。下一步尝试什么的任何想法?
  • 最佳答案

    要解决此问题,您可能需要调整 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
    

    所以y标签的放置与标签的字符数成正比,只需去掉log10(nchar(labels) + 1)并且标签将保持在同一水平。

    对于尺寸问题,如果你想保留rescale , y图的位置定义为第 55 行
    layout <- layout.norm(layout, -1, 1, -1, 1)
    

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

    和后剧情par(mar=oldMargins)
    这是我在调整后使用此代码得到的图:

    enter image description here

    我离开了轴以使其更容易调整,并删除了馅饼,因为您的帖子中没有给出任何值。
    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)
    

    当您重新启动 R 时,您对该函数所做的任何更改都将被删除,或者您可以使用 untrace回到原来的功能。你可以看看this post了解更多信息。

    关于r - igraph:定位标签并删除网格布局中的空白空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28542966/

    相关文章:

    r - 使用 ggtree 绘制 igraph 树对象

    R 包命名空间

    r - 多有向边 igraph

    r - 按列计数组合,顺序不重要R

    r - 使用dplyr和select_()从数据框中选择列列表

    r - 将文本和线条添加到图形中的 `image()`

    r - 在 R 中向 fill.contour 添加点 - 在正确的位置

    r - iGraph:如何创建具有特定级别的图表?

    RStudio TreeMap-Idvar 与 Parentvar 不匹配

    r - 如何计算不同群体的共同值(value)?