在igraph中,将顶点大小匹配到标签大小

9
我正在尝试使用R中的igraph绘制小型网络。网络中的每个顶点都有一个名称,相当于它的标签。我想让每个顶点都有一个矩形符号,大小刚好能容纳它的标签。

这是我的主要灵感来源。

Map of Hyperboria

如何使用igraph最佳实践?

编辑:更多信息

代码在 这里

jsonToNM <- function(jfile, directed=TRUE) {
  # Requires "rjson" and "igraph"

  nm.json <- fromJSON(file=jfile)
  nm.graph <- c()

  # Initialize the graph with the given nodes
  g <- graph.empty(n=length(nm.json), directed=directed)
  # Add their names
  V(g)$name <- names(nm.json)
  V(g)$label <- V(g)$name

  # Now, add the edges
  for(i in 1:length(nm.json)) {
    # If the node has a "connected" field,
    # then we note the connections by looking
    # the names up.
    if(length(nm.json[[i]]$connected > 0)) {
      for(j in 1:length(nm.json[[i]]$connected)) {
        # Add the entry
        g <- g + edge(names(nm.json)[i],
                        nm.json[[i]]$connected[j])
      }
    }
  }

  plot(g, vertex.label.dist=1.5)
}

当前输出如下。

current output

我的目标是将标签放置在顶点图形内部,并扩展顶点的宽度以容纳标签。

你能否展示一个可重现的输入示例,以及你迄今为止如何创建图形(可能没有正确的顶点)?你可以使用dput来提供数据。 - David Robinson
这不是一个可重现的例子。我没有 jfile - Gabor Csardi
2个回答

11

这里有一个例子。在一些卑劣手段中(如将顶点大小乘以200),关键是使用两个绘图命令,这样我们就可以在第一个(空)图之后设置绘图大小并使用strwidth()测量标签的宽度(和高度)。

library(igraph)
camp <- graph.formula(Harry:Steve:Don:Bert - Harry:Steve:Don:Bert,
                      Pam:Brazey:Carol:Pat - Pam:Brazey:Carol:Pat,
                      Holly   - Carol:Pat:Pam:Jennie:Bill,
                      Bill    - Pauline:Michael:Lee:Holly,
                      Pauline - Bill:Jennie:Ann,
                      Jennie  - Holly:Michael:Lee:Ann:Pauline,
                      Michael - Bill:Jennie:Ann:Lee:John,
                      Ann     - Michael:Jennie:Pauline,
                      Lee     - Michael:Bill:Jennie,
                      Gery    - Pat:Steve:Russ:John,
                      Russ    - Steve:Bert:Gery:John,
                      John    - Gery:Russ:Michael)

V(camp)$label <- V(camp)$name
set.seed(42)   ## to make this reproducable
co <- layout.auto(camp)

plot(0, type="n", ann=FALSE, axes=FALSE, xlim=extendrange(co[,1]), 
     ylim=extendrange(co[,2]))
plot(camp, layout=co, rescale=FALSE, add=TRUE,
     vertex.shape="rectangle",
     vertex.size=(strwidth(V(camp)$label) + strwidth("oo")) * 100,
     vertex.size2=strheight("I") * 2 * 100)

igraph节点标签宽度

顺便说一句,这与SVG图形不太兼容,因为无法从R中测量文本的宽度,SVG设备只能猜测。


我需要玩弄一下这个。谢谢! - Alexander Bauer
@Gabor Csardi(或其他人),你能告诉我为什么当我在R Studio控制台中输入相同的代码时,会得到橙色、丑陋、间距不均匀的矩形,而不是这个漂亮的蓝色示例吗? - Zediiiii

1
我知道这不是直接回答你的问题,但我建议使用另一种可视化工具。yEd非常擅长调整节点宽度以适应标签大小。您还可以轻松操作可视化效果,并将其导出为SVG进行最终修饰。它可以从www.yworks.com免费获取(免责声明:我不在那里工作)。
要以易读的格式导出图形(yEd不理解igraph的gml格式),请使用graphml。
write.graph(graph, "test.graphml", format="graphml")

在yEd中打开它。转到编辑->属性映射器,然后单击“新配置(节点)”(绿色的“加号”符号,左上角)。在框架中间,在“数据源”下搜索标签的名称(应为“name”)。在名为“映射到”的中间选项卡中选择“标签文本”,右列中保留“转换”设置为“自动”。

现在选择工具 -> 拟合节点到标签(默认参数对于第一次尝试很好),然后选择您喜欢的布局。您可以导出各种图像格式,但据我所知,所有格式都使用位图中间格式实现。因此,我通常将其导出为SVG,并在inkscape中进行修饰。如果有人知道更有效的程序来生成igraph中产生的中等大小图形的好看布局,请告诉我。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接