首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iGraph:如何创建具有特定级别的图形?

iGraph:如何创建具有特定级别的图形?
EN

Stack Overflow用户
提问于 2013-03-29 01:13:46
回答 2查看 843关注 0票数 2

更新下面有一个我正在尝试完成的示例。我还感兴趣的是更一般的技巧,以平分任意的情节。在绘制顶点之后,是否有某种GUI方法可以直观地调整顶点,而不必像Gabor解决方案那样手工进行调整?我已经找到了一种方法来做这件事,见下面的答案,但需要时间使它更笼统。

目标

故障

代码语言:javascript
复制
library(igraph)
g4<-graph.formula(Out-1:3:5:6,1-2,3-4,5:6-7,2:4:7-In)
tkplot(g4)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-31 02:35:24

因此,为了回答这个问题,可以用it来完成,但是您需要手动设置顶点位置。不过,您可以使用tkplot()tkplot.getcoords()来完成。

此外,您还需要为连接添加顶点,因为在igraph中,边缘要么是直线,要么是曲线,而不是折线。

代码语言:javascript
复制
library(igraph)

G <- graph.formula(Out-3, j1-1:j2, j2-j4, j3-5:j5, j5-6,
                   1-2, 3-4, 5-j6, 6-j8, j6-j8, j7-7, 2-j9, 4-In, 7-j10,
                   j9-j10)

coords <- read.table(textConnection(
  "Out 2   1
   In  2   8
   1   1   4
   2   1   6
   3   2   4
   4   2   6
   5   2.5 4
   6   3.5 4
   7   3   6
   j1  1   2
   j2  3   2
   j3  2.5 3
   j4  3   3
   j5  3.5 3
   j6  2.5 5
   j7  3   5
   j8  3.5 5
   j9  1   7
   j10 3   7"))

layout <- as.matrix(coords[match(V(G)$name, coords[,1]),2:3])
layout[,2] <- -layout[,2]

V(G)$shape <- ifelse(grepl("^j", V(G)$name), "none", "circle")
V(G)$label <- ifelse(grepl("^j", V(G)$name), "", V(G)$name)
V(G)$size  <- ifelse(grepl("^j", V(G)$name), 0, 30)
V(G)$color <- "white"
V(G)$label.color <- "black"

par(mar=c(0,0,0,0)+.1)
plot(G, layout=layout, asp=NA)

票数 3
EN

Stack Overflow用户

发布于 2013-04-01 13:29:15

,但您需要手动设置顶点位置。

这不是完全正确的。我将展示一个更简单的交互式way。我将使用下面的代码由格雷格斯诺。

代码语言:javascript
复制
dynmodfunc <- function() {
    plot(0:1,0:1,ann=FALSE,type='n')
    mypoints <- matrix(ncol=2, nrow=0)
    while( length(p <- locator(1, type='p', col='red')) ) {
        mypoints <- rbind(mypoints, unlist(p))
        plot(mypoints, col='red', ann=FALSE, xlim=0:1, ylim=0:1)
        if(nrow(mypoints)>1) {
            xspline(mypoints, shape=-1)
        }
    }
    mypoints
}

(out <- dynmodfunc())

我想绘制这个优势图

但是adjm<-t(matrix(c(0,0,0,0,1,1,0, 0,0,0,0,1,1,0, 0,0,0,0,1,1,0, 0,0,0,0,1,1,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 1,1,1,1,0,0,0),nrow=7,ncol=7)); g1<-graph.adjacency(adjm); plot(g1)会产生

并使用Greg的代码:单击GUI上的点,然后单击鼠标右键

其中,按7-1-2-3-4-5-6的顺序排列,如行或调试所示:

代码语言:javascript
复制
> out
             x          y
[1,] 0.5082585 1.03551763
[2,] 0.1067841 0.59191675
[3,] 0.3818711 0.59358184
[4,] 0.6380311 0.58883584
[5,] 0.8787300 0.58464820
[6,] 0.3417308 0.09010765
[7,] 0.6614686 0.07504212
> str(out);dput(out)
 num [1:7, 1:2] 0.508 0.107 0.382 0.638 0.879 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:2] "x" "y"
structure(c(0.508258492696219, 0.106784127536735, 0.381871061286441, 
0.63803114223351, 0.878729976271015, 0.341730770349654, 0.661468641881514, 
1.03551763062279, 0.591916752784156, 0.593581838904923, 0.588835844931958, 
0.584648203191106, 0.0901076547476853, 0.0750421150561933), .Dim = c(7L, 
2L), .Dimnames = list(NULL, c("x", "y")))

现在,通过Gabor Csardi的解决方案,应该可以得到平直的图解。现在我们有了并发矩阵ajdm,并对每个点进行coords坐标。我还不知道如何用Gabor的方法来理解。

快速复制粘贴代码

代码语言:javascript
复制
> library(igraph); 
> coords<-structure(c(0.508258492696219, 0.106784127536735, 0.381871061286441, 0.63803114223351, 0.878729976271015, 0.341730770349654, 0.661468641881514, 1.03551763062279, 0.591916752784156, 0.593581838904923, 0.588835844931958, 0.584648203191106, 0.0901076547476853, 0.0750421150561933), .Dim = c(7L, 2L), .Dimnames = list(NULL, c("x", "y")))
> adjm<-t(matrix(c(0,0,0,0,1,1,0,   0,0,0,0,1,1,0,   0,0,0,0,1,1,0,   0,0,0,0,1,1,0,   0,0,0,0,0,0,0,    0,0,0,0,0,0,0,   1,1,1,1,0,0,0),nrow=7,ncol=7)); g1<-graph.adjacency(adjm); plot(g1)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15695859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档