我想创建一个函数来绘制顶点对齐的有向图并在每个顶点下方添加一些文本,即类似于下面的示例图。绘图函数应该能够将饼图作为顶点处理,所以我使用了 igraph
R中的包。
adjm <- matrix(c(0,1,0,1,
0,0,1,1,
0,0,0,1,
0,0,0,0), nrow=4, byrow=TRUE)
g1 <- graph.adjacency(adjm, mode="directed")
values <- lapply(1:4, function(x) sample(1:4,4))
windows(width=7, height=3.5)
plot(g1, layout=layout.grid(g1, width=4),
vertex.shape="pie", vertex.pie=values,
vertex.pie.color=list(heat.colors(4)),
edge.curved=TRUE,
vertex.label=LETTERS[1:4], vertex.size=50,
vertex.label.dist=5, vertex.label.degree=pi/2,
edge.label=1:5, rescale=FALSE,
xlim=c(-0.2,3.5), ylim=c(0,0.5))
我有两个问题。
windows(width=7, height=3.5)
plot(g1, layout=layout.grid(g1, width=4),
vertex.shape="pie", vertex.pie=values,
vertex.pie.color=list(heat.colors(4)),
edge.curved=TRUE,
vertex.label=c("A", "AA", "AAAA", "AAAAAA"), vertex.size=50,
vertex.label.dist=5, vertex.label.degree=pi/2,
edge.label=1:5, rescale=FALSE,
xlim=c(-0.2,3.5), ylim=c(0,0.5))
plot(g1, layout=layout.grid(g1, width=4),
vertex.shape="pie", vertex.pie=values,
vertex.pie.color=list(heat.colors(4)),
edge.curved=TRUE,
vertex.label=c("A", "AA", "AAAA", "AAAAAA"), vertex.size=20,
vertex.label.dist=2, vertex.label.degree=pi/2, edge.label=1:5)
我可以写论据
asp=0
使顶点在更平坦的窗口中保持正确的大小,但自动曲率和顶点标签的位置会发生变化。我可以手动调整负上边距、标签距离和边缘曲率,但这当然不是通用函数的解决方案。迄今为止最好的结果是rescale=FALSE
的结果与第一个图的代码一样,但边缘曲率仍然太小,并且顶点较大时,它们完全位于顶点后面。 (此外,顶点标签距离变化的问题仍然存在。)直接使用 autocurve.edges
没有给我任何曲率。下一步尝试什么的任何想法? 最佳答案
要解决此问题,您可能需要调整 plot.igraph
有点功能。为此,您可以尝试使用 trace(plot.igraph,edit=TRUE)
并修改函数的代码。
获得您想要的东西的一些提示:
对于标签,函数的第 319 行是:
y <- layout[, 2] + label.dist * sin(-label.degree) * (vertex.size + 6 * 8 * log10(nchar(labels) + 1))/200
所以
y
标签的放置与标签的字符数成正比,只需去掉log10(nchar(labels) + 1)
并且标签将保持在同一水平。对于尺寸问题,如果你想保留
rescale
, y
图的位置定义为第 55 行layout <- layout.norm(layout, -1, 1, -1, 1)
您可以将第三个数字更改为您想要的任何数字,并且绘图会更高(例如,
layout <- layout.norm(layout, -1, 1, 0, 1) will center the vertexes on 0). You can also change the margins by changing the
par` 设置。例如,您可以执行以下操作:oldMargins<-par("mar")
par(mar=c(10,4,4,4))
和后剧情
par(mar=oldMargins)
这是我在调整后使用此代码得到的图:
我离开了轴以使其更容易调整,并删除了馅饼,因为您的帖子中没有给出任何值。
oldMargins<-par("mar")
par(mar=c(10,4,4,4))
plot(g1, layout=layout.grid(g1, width=4),
vertex.pie.color=list(heat.colors(4)),
edge.curved=TRUE,
vertex.label=c("A", "AA", "AAAA", "AAAAAA"), vertex.size=20,
vertex.label.dist=1, vertex.label.degree=pi/2, edge.label=1:5,axes=TRUE,
ylim=c(-0.5,0.5),xlim=c(-1,1))
par(mar=oldMargins)
当您重新启动 R 时,您对该函数所做的任何更改都将被删除,或者您可以使用
untrace
回到原来的功能。你可以看看this post了解更多信息。
关于r - igraph:定位标签并删除网格布局中的空白空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28542966/