调整igraph图的可视化呈现

3
根据此处的讨论,我正在使用igraph来可视化两个变量(sg)之间的关联。
在shell中:
$ cat file
s   g
s1  foo bar
s2  foo bar baz qux
s99 foo
s9999   foo bar baz qux
s99999  foo
s999999 foo

在 R 中:
m <- as.matrix(read.table(file="~/path_to_file/file", sep="\t", header=T))
g <- graph_from_edgelist(m)
V(g)$type <- bipartite.mapping(g)$type
coords <- layout_as_bipartite(g)
plot.igraph(g, layout = -coords[,2:1],
    vertex.shape="rectangle",
    vertex.size=10,
    vertex.size2=1,
    vertex.color=NA,
    vertex.frame.color=NA,
    vertex.label.color="black",
    vertex.label.family="sans",
    edge.label.color="white",
    edge.arrow.mode=0,
    edge.width=3,
    asp=5)

然而,生成的可视化图形中顶点标签和边缘重叠,使得前者难以阅读。

enter image description here

我想调整R代码,使得所有顶点标签都远离顶点中心(即的顶点标签向左移动,g的顶点标签向右移动),并且所有顶点标签都是左对齐的(而不是居中对齐,默认情况下是居中对齐)。
我能通过igraph实现这个功能吗?如果可以,怎么做?如果不可能,你会建议使用哪种其他可视化策略在R中实现此目的?

--

编辑1: 一个可行的解决方案应该能够处理包含大量顶点的文件,例如file2
在shell中:
$ cat file2
s   g
foo1    bar01 baz qux
foo2    bar1 baz qux
foo3    bar1 baz qux
foo4    bar1 baz qux
foo5    bar1 baz qux
foo6    bar1 baz qux
foo7    bar1 baz qux
foo8    bar1 baz qux
foo9    bar1 baz qux
foo10   bar1 baz qux
foo11   bar02 baz
foo12   bar2 baz
foo13   bar2 baz
foo14   bar2 baz
foo15   bar2 baz
foo16   bar2 baz
foo17   bar2 baz
foo18   bar2 baz
foo19   bar2 baz
foo20   bar2 baz
foo21   bar03 baz baz qux
foo22   bar3 baz baz qux
foo23   bar3 baz baz qux
foo24   bar3 baz baz qux
foo25   bar3 baz baz qux
foo26   bar3 baz baz qux
foo27   bar3 baz baz qux
foo28   bar3 baz baz qux
foo29   bar3 baz baz qux
foo30   bar3 baz baz qux
foo31   bar04 baz baz qux quux
foo32   bar4 baz baz qux quux
foo33   bar4 baz baz qux quux
foo34   bar4 baz baz qux quux
foo35   bar4 baz baz qux quux
foo36   bar4 baz baz qux quux
foo37   bar4 baz baz qux quux
foo38   bar4 baz baz qux quux
foo39   bar4 baz baz qux quux
foo40   bar4 baz baz qux quux
foo41   bar05 baz qux quux
foo42   bar5 baz qux quux
foo43   bar5 baz qux quux
foo44   bar5 baz qux quux
foo45   bar5 baz qux quux
foo46   bar5 baz qux quux
foo47   bar5 baz qux quux
foo48   bar5 baz qux quux
foo49   bar5 baz qux quux
foo50   bar5 baz qux quux
foo51   bar06 baz qux
foo52   bar6 baz qux
foo53   bar6 baz qux
foo54   bar6 baz qux
foo55   bar6 baz qux
foo56   bar6 baz qux
foo57   bar6 baz qux
foo58   bar6 baz qux
foo59   bar6 baz qux
foo60   bar6 baz qux
foo61   bar07 baz qux quux
foo62   bar7 baz qux quux
foo63   bar7 baz qux quux
foo64   bar7 baz qux quux
foo65   bar7 baz qux quux
foo66   bar7 baz qux quux
foo67   bar7 baz qux quux
foo68   bar7 baz qux quux
foo69   bar7 baz qux quux
foo70   bar7 baz qux quux

即使实施了G5W建议的改进(即针对每个顶点分别调整顶点宽度;参见变量Size1),生成的图仍然难以(或几乎不可能)可视化。具体而言,似乎不存在一个在纵横比、顶点高度和顶点宽度之间的最佳平衡点。
R中:
Size1 = 12*nchar(V(g)$name)
plot.igraph(g, layout = -coords[,2:1],
    vertex.shape="rectangle",
    vertex.size=Size1,
    vertex.size2=5,
    vertex.color=NA,
    vertex.frame.color="green",
    vertex.label.color="black",
    vertex.label.family="sans",
    edge.label.color="white",
    edge.arrow.mode=0,
    edge.width=3,
    asp=2.5
    )

enter image description here

1个回答

1
这里最大的问题是你的顶点大小。通过将当前的绘图语句更改为vertex.frame.color="green",你可以看到矩形顶点在文本下面只有一个小点。如果有一个包含文本的完整大小的顶点,你可以使用白色背景来遮挡文本所在的线条。当你改变顶点大小时,你可能也需要改变宽高比。
为了使这个工作更好,我根据名称中的文本数量使用不同大小的矩形。我展示了填充白色和白色框架的顶点结果,但请尝试使用绿色框架(在代码中但被注释掉)以便你可以看到盒子的位置。这些盒子是必要的,以遮挡到顶点中心的线条。
Size1 = 12*nchar(V(g)$name)
plot.igraph(g, layout = -coords[,2:1],
    vertex.shape="rectangle",
    vertex.size=Size1,
    vertex.size2=30,
    vertex.color=NA,
    ## vertex.frame.color="green",
    vertex.frame.color="white",
    vertex.label.color="black",
    vertex.label.family="sans",
    edge.label.color="white",
    edge.arrow.mode=0,
    edge.width=3,
    asp=1.5)

Rescaled

编辑:根据修改后的问题

有了新的更大的示例,我认为你无法获得真正好的结果,因为你试图将太多内容挤在屏幕上。你试图在左侧显示70个节点,所以最多每个节点只能占屏幕的1/70 - 空间很小。下面,我减小了字体大小、行宽和边距。然后我重新调整了其他参数,尽可能地挤压屏幕空间。这只是勉强令人满意的,但我认为你不能再加入更多内容而不从根本上重新设计节点的布局。左列中已经没有更多的空间了。

新代码

Size1 = 5.5*nchar(V(g)$name)
par(mar=rep(0.5,4))
plot.igraph(g, layout = -coords[,2:1],
    vertex.shape="rectangle",
    vertex.size=Size1,
    vertex.size2=5,
    vertex.color="white",
#    vertex.frame.color="green",
    vertex.frame.color="white",
    vertex.label.color="black",
    vertex.label.family="sans",
    edge.label.color="white",
    edge.arrow.mode=0,
    edge.width=1,
    asp=2.8,
    vertex.label.cex=0.55, 
    margin=-0.65
    )

Redrawn graph


谢谢您的建议。是的,应用自定义顶点框架大小(其中大小取决于名称长度)是代码的重要改进。但是,即使实施了这个改进,我仍然无法格式化一个现实的例子(请参见更新的帖子!)。您将如何解决现实例子“file2”? - Michael Gruenstaeudl
我能提供的最接近的代码如下,但它将顶点堆叠得如此紧密,以至于您无法区分各个行:Size1 = 12*nchar(V(g)$name); plot.igraph(g, layout = -coords[,2:1], vertex.shape="rectangle", vertex.size=Size1, vertex.size2=5, vertex.color=NA, vertex.frame.color="green", vertex.label.color="black", vertex.label.family="sans", edge.label.color="white", edge.arrow.mode=0, edge.width=3, asp=2.5 ) - Michael Gruenstaeudl

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