我试图在R中使用igraph绘制小型网络。网络中的每个顶点都有一个名称,它等同于其标签。我想让每个顶点都有一个矩形符号,该符号足够大以适合其标签。
这是我的主要灵感。
使用igraph进行此操作的最佳方法是什么?
编辑:更多信息
代码为here
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)
}
目前的输出低于。
我的目标是将标签放在顶点图形内,并展开顶点的宽度以容纳标签。
答案 0 :(得分:7)
这是一个例子。在一些肮脏的技巧(即将顶点大小乘以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)
顺便说一下。这对SVG图形效果不太好,因为无法测量R中文本的宽度,SVG设备只能猜测。
答案 1 :(得分:0)
我知道这不是您问题的直接答案,但我建议使用其他工具进行可视化。 yEd非常擅长将节点的宽度调整为标签的大小。您还可以轻松操作可视化,并将其导出到SVG以进行最终润色。它可以从www.yworks.com免费获得(免责声明:我不在那里工作)。
要以易读的格式导出图形(yEd不理解igraph的gml格式),请使用graphml:
write.graph(graph, "test.graphml", format="graphml")
在yEd中打开它。转到编辑 - &gt;属性映射器并单击“新配置(节点)”(绿色“加”符号,左上角)。在fram的中间,在“数据源”下,搜索标签的名称(应该是'name')。在名为“map to”的中间选项卡中选择“标签文本”,在右栏中将“转换”设置为“自动”。
现在选择工具 - &gt;将节点拟合到标签(第一次尝试时默认参数正常),然后选择您喜欢的布局。您可以导出为各种图像格式,但据我所知,所有这些都是使用位图中间实现的。因此,我通常导出到SVG并在inkscape中进行抛光。如果有人知道更有效的程序来获得igraph中生成的中等大小图形的漂亮布局,请告诉我。