[更新] 下面有一个我正在尝试完成的示例。我也对更通用的技术感兴趣,以平整任意图。是否存在一些 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)
所以只是为了回答这个问题,可以用 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)
但是您需要手动设置顶点位置。
这并不完全正确。我将展示一种更简单的交互方式。我将使用 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)