使用R中的igraph控制图形图的美学

时间:2014-12-24 17:08:38

标签: r plot igraph tkplot

我有这样的数据集:

final.Df
       X1     X2        X3
1  event1 event2 event5.n1
2  event1 event2 event5.n1
3  event1 event2 event6.n1
4  event1 event3 event6.n2
5  event1 event3 event7.n2
6  event1 event3 event7.n2
7  event1 event4 event7.n3
8  event1 event4 event7.n3
9  event1 event4 event8.n3
10 event1 event4 event8.n3 

(原始数据可能包含最多200行(aprox)和最多10列。我使用这个简化数据集来说明问题。从这个数据集我使用下面的代码绘制流程图(或树图表)使用R中的包igraph(下面的代码部分基于Creating treechart from tabbed text in R):

##create edges 
edges <- rbind(na.omit(final.Df[1:2]),
           do.call('rbind',
                   lapply(1:(ncol(final.Df)-2), function(i) 
                          na.omit(setNames(final.Df[(1+i):(2+i)],
                                           names(final.Df[1:2]))))))

##remove duplicated edges.
rm.ind <- c()
for (i in 2:nrow(edges)){
    if (edges[i,1] == edges[i-1,1] & edges[i,2] == edges[i-1,2]){
        rm.ind <- c(rm.ind, i) 
    }
}
edges <- edges[-rm.ind,]

## create graph
require(igraph)
g <- graph.data.frame(edges)
E(g)$curved <- 0
E(g)$label <- rep(1, nrow(edges))
plot.igraph(g, vertex.size=0, edge.arrow.size=0 ,
                  layout=-layout.reingold.tilford(g)[,2:1])

结果图附于此帖子。

使用这个缩小的数据集,情节看起来不错。但是,当使用更大的数据集时,事件(event5,event6等)开始于#34;堆叠在彼此之上&#34;并且图表变得难以阅读。因此,我想知道是否有办法控制边缘的位置或分离。此外,读者会注意到标签(在这种情况下,所有数字1)都落在边缘的顶部。理想情况下,我希望标签超出边缘(我已经读过一些使用包qgraph,但我假设可以使用igraph(?))

我尝试使用tkplot,因为您似乎能够控制结果图的大小,但我得到以下错误:

tkplot(g, canvas.width=450, canvas.height=450, vertex.size=0, edge.arrow.size=0 ,
                   layout=-layout.reingold.tilford(g)[,2:1])
Loading required package: tcltk
Error in structure(.External(.C_dotTclObjv, objv), class = "tclObj") : 
  [tcl] expected integer but got "font266".

我在stackoverflow上看到这个错误可能与某些补丁tcl / tk 8.5安装(TCLK error when I run 'validate' from the rms package)有关,但是我已经检查过,这不是我的情况(所以不知道如何解决这个问题)错误。)

在这个阶段,我需要一些专家帮助来控制图形图的美学。总结一下:

1 - 如何在此处显示的图中控制边缘之间的位置和/或角度?另一个选择是更好地使用石英绘图窗口的整个表面。

2 - 如何控制与边缘相关的标签的位置?

3-而且不太重要,此tkplot错误消息来自哪里?

提前致谢

0 个答案:

没有答案