2

[更新] 下面有一个我正在尝试完成的示例。我也对更通用的技术感兴趣,以平整任意图。是否存在一些 GUI 方法可以在绘制顶点后直观地调整顶点,从而不必像 Gabor 解决方案那样手动进行?我找到了一种方法,请参阅下面的答案,但需要时间使其更通用。

目标

在此处输入图像描述

失败

library(igraph)
g4<-graph.formula(Out-1:3:5:6,1-2,3-4,5:6-7,2:4:7-In)
tkplot(g4)

在此处输入图像描述

4

2 回答 2

3

所以只是为了回答这个问题,可以用 igraph 来做这个,但是你需要手动设置顶点位置。不过,您可以使用tkplot()tkplot.getcoords()进行微调。

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

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)

阴谋

于 2013-03-31T02:35:24.937 回答
2

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

这并不完全正确。我将展示一种更简单的交互方式。我将使用 Greg Snow 编写的以下代码。

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 的顺序排列:

> 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 的方法使用它们,试图理解。

快速复制粘贴代码

> 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)
于 2013-04-01T13:29:15.160 回答