gpt4 book ai didi

r - 在图形上手动绘制

转载 作者:行者123 更新时间:2023-12-02 09:37:02 25 4
gpt4 key购买 nike

我生成了一个图表:

library(DiagrammeR)
grViz("
digraph boxes_and_circles {

# a 'graph' statement
graph [layout = neato, overlap = true, fontsize = 10, outputorder = edgesfirst]

# several 'node' statements
node [shape = circle,
fontname = Helvetica]
A [pos = '1,1!'];
B [pos = '0,2!'];
C [pos = '1.5,3!'];
D [pos = '2.5,1!'];
E [pos = '4,1!'];
F [pos = '4,2!'];
G [pos = '5,1!'];
H [pos = '6,2!'];
I [pos = '1.5,-0.1!'];

# several 'edge' statements
A->B B->C
D->E D->F E->F E->G F->G G->H F->H
}
")

产生:

enter image description here

现在我想在节点 A、B 和 C 周围绘制一个带有虚线的框。

如何在 R 中实现此目的?该解决方案的一个关键要求是它是可重现的,即我可以多次运行脚本并获得相同的结果。

最佳答案

这是另一种基于 igraph 的方法。它的灵感来自于这个 igraph code sample .

我假设使用 igraph 而不是 DiagrammeR 是一种选择 - 也许情况并非如此......

我们将顶点的定位留给标准布局算法,并查询它以获取结果顶点位置。然后使用这些位置在任意一组“选定”顶点周围绘制虚线矩形。无需用户交互。

我们从图拓扑开始。

library(igraph)

set.seed(42)

df <- data.frame(from = c('A', 'B', 'I', 'D', 'D', 'E', 'E', 'F', 'F', 'G'),
to = c('B', 'C', 'I', 'E', 'F', 'G', 'F', 'H', 'G', 'H'))

g <- graph.data.frame(df, directed = TRUE)

图中顶点和箭头的大小可以根据喜好自由设置。

vertexsize <- 50
arrowsize <- 0.2

我们要求 Fruchterman-Reingold 布局引擎计算顶点的坐标。

coords <- layout_with_fr(g)

然后绘制图表。

plot(g,
layout = coords,
vertex.size = vertexsize,
edge.arrow.size = arrowsize,
rescale = FALSE,
xlim = range(coords[,1]),
ylim = range(coords[,2]))

如果我们想看看发生了什么,我们可以添加坐标轴并打印顶点坐标:

axis(1)
axis(2)

V(g) # ordered vertex list
coords # coordinates of the vertices (in the same coordinate system as our dotted rectangle)

我们现在找出我们想要的矩形周围的顶点的边界框。

selectedVertices = c("A", "B", "C")
vertexIndices <- sapply(selectedVertices, FUN = function(x) { return(as.numeric(V(g)[x])) } )
llx <- min(coords[vertexIndices, 1])
lly <- min(coords[vertexIndices, 2])
urx <- max(coords[vertexIndices, 1])
ury <- max(coords[vertexIndices, 2])

快到了。我们已经在 coords[] 中获得了顶点的坐标 centers,但我们还需要在plot() 的坐标系中获得顶点的大小。从plot.igraph源代码中我们可以看到plot()的vertex.size选项除以200,然后用作绘制顶点的半径。绘制虚线矩形时,我们使用大 50% 的值作为顶点坐标边界框周围的边距。

margin <- (vertexsize / 200) * 1.5
rect(llx - margin, lly - margin, urx + margin, ury + margin, lty = 'dotted')

这是我们得到的结果:

enter image description here

关于r - 在图形上手动绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31791064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com