在R中的igraph中,我目前有一个看起来像这样的图:
由代码制成:
g <- make_undirected_graph(edges = c(1, 3, 2, 1, 2, 4, 3, 4, 4, 5), n = 5)
我想在点上是圆的虚线。有一个edge.label
选项,但没有vertex.label
选项。还有另一种方法吗?谢谢。
答案 0 :(得分:5)
您可以定义自己的形状:https://igraph.org/r/doc/shapes.html,并且在https://r.789695.n4.nabble.com/Drawing-a-dotted-circle-td4655331.html上给出带有虚线边框的点的示例。在https://lists.gnu.org/archive/html/igraph-help/2013-03/msg00030.html中给出的创建新形状的完整示例。另请参见?add_shape
上的更多示例。下面的示例对list.gnu.org中的代码进行了调整,以结合所有内容。
创建新igraph
形状的功能
myimg <- function(coords, v=NULL, params) {
vertex.color <- params("vertex", "color")
if (length(vertex.color) != 1 && !is.null(v)) {
vertex.color <- vertex.color[v]
}
vertex.size <- 1/200 * params("vertex", "size")
if (length(vertex.size) != 1 && !is.null(v)) {
vertex.size <- vertex.size[v]
}
vertex.frame.color <- params("vertex", "frame.color")
if (length(vertex.frame.color) != 1 && !is.null(v)) {
vertex.frame.color <- vertex.frame.color[v]
}
vertex.frame.width <- params("vertex", "frame.width")
if (length(vertex.frame.width) != 1 && !is.null(v)) {
vertex.frame.width <- vertex.frame.width[v]
}
ltype <- params("vertex", "ltype")
if (length(ltype) != 1 && !is.null(v)) {
ltype <- ltype[v]
}
mapply(coords[,1], coords[,2], vertex.color, vertex.frame.color,
vertex.size, vertex.frame.width, ltype,
FUN=function(x, y, bg, fg, size, lwd, lty) {
symbols(x=x, y=y, bg=bg, fg=fg, lwd=lwd, lty=lty,
circles=size, add=TRUE, inches=FALSE)
})
}
然后使用igraph
使add_shape
识别形状。您可以使用parameters
参数设置默认参数值。
library(igraph)
g <- make_undirected_graph(edges = c(1, 3, 2, 1, 2, 4, 3, 4, 4, 5), n = 5)
add_shape("myimg", plot=myimg,
parameters = list(
vertex.frame.color=1,
vertex.frame.width=1,
vertex.ltype=1))
然后情节
plot(g, vertex.shape="myimg",
vertex.frame.color=1:5,
vertex.frame.width=5,
vertex.ltype=1:5,
vertex.color=6:10,
vertex.size=seq(50, 80, length=5))
要使用虚线绘制所有边框,只需使用vertex.ltype="dotted"
或vertex.ltype=3
。
答案 1 :(得分:3)
我不确定如何在igraph
中执行此操作,但是一个选择是使用ggraph
打印该文件,该软件包将igraph
与ggplot2
桥接在一起。然后,我们可以按层构建图形并指定每个图形的外观:
library(ggraph)
ggraph(g) +
geom_edge_link(color = "gray60") +
geom_node_circle(aes(r = 0.1), lty = "dashed", fill = "orange") +
geom_node_text(aes(label = ggraph.orig_index)) +
coord_equal() +
theme_void()
答案 2 :(得分:3)
我不使用igraph,但是我发现网络软件包可以很好地替代它,并且它的绘图功能更加直观(如果您熟悉基本绘图参数)并且更易于自定义。但是我100%确信您可以在igraph中找到类似的功能,让您调整绘图参数。
require(network)
# build the network
g = as.network.matrix(x = matrix(c(1, 3, 2, 1, 2, 4, 3, 4, 4, 5), nrow = 5, byrow = T), matrix.type = 'edgelist', directed = F)
# vertex.lty is the parameter you are looking for, and you can pass an array to it.
# lty = 2 for dashed lines and lty = 3 for dotted lines.
plot(g, label = 1:5, label.pos = 5,
vertex.cex =6, vertex.col = "#ffdd88",
vertex.lty = c(1,2,2,3,3), vertex.lwd = c(2,3,4,2,3))
(为获得更好的格式而进行了编辑。)