【问题标题】:Adjusting visualization of igraph plot调整 igraph 图的可视化
【发布时间】:2018-07-22 15:25:08
【问题描述】:

在讨论here 之后,我使用igraph 来可视化两个变量(sg)之间的关联。

在外壳中:

$ 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)

但是,生成的可视化具有顶点标签和边缘重叠,使得前者难以阅读。

我想调整 R 代码,使所有顶点标签都远离顶点中心(即,s 的顶点标签向左移动,g 的顶点标签向右移动)并且所有顶点标签左对齐(默认情况下不居中)。

我可以通过igraph 做到这一点吗?如果可以,怎么做? (如果这不可能,您会建议R 中的哪种替代可视化策略?)

--

编辑 1: 一个可行的解决方案将能够处理具有多个顶点的文件,例如file2

在外壳中:

$ 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
    )

【问题讨论】:

    标签: r visualization data-visualization igraph diagram


    【解决方案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)
    

    编辑:基于已编辑的问题

    对于新的更大的例子,我不认为你能得到很好的结果,因为你试图在屏幕上挤压太多。您正在尝试显示堆叠在左侧的 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
        )
    

    【讨论】:

    • 感谢您的建议。是的,应用自定义顶点帧大小(大小取决于名称长度)是对代码的重要改进。然而,即使实现了这种改进,我仍然无法格式化一个现实的例子(见更新的帖子!)。你会如何处理现实的例子file2
    • 我能想出的最接近的代码如下,但它把顶点堆叠得很紧,你无法区分各个行: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 )
    猜你喜欢
    • 2013-07-28
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 2019-05-27
    • 2018-07-15
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多