我正在尝试使用两个边缘标签绘制Rgraphviz
对象。不幸的是,标签不属于情节。这是我的例子:
require('Rgraphviz')
set.seed(123)
g1 <- randomGraph(letters[1:10], 1:4, 0.4)
eAttrs <- list()
eAttrs$label <- c("a~g" = "I have a very long label 1", "a~i" = "and a long label 2")
plot(g1, edgeAttrs = eAttrs)
这是我的情节:
我尝试了几件事但没有成功:
1 设置一个更大的边界框
z <- agopen(g1, "foo")
z@boundBox@upRight@x <- z@boundBox@upRight@x + 300
z@boundBox@upRight@y <- z@boundBox@upRight@y + 300
plot(z, edgeAttrs = eAttrs)
2 减少标签fontsize(不管我的应用程序中真的不是我想要的)
eAttrs$labelfontsize=c("a~g"="3")
plot(g1, edgeAttrs = eAttrs)
第3
更改par
属性:
par(oma=c(10,10,10,10))
plot(g1, edgeAttrs = eAttrs)
4
从?Rgraphviz::GraphvizAttributes
attrs <- list(graph=list(size=c(1, 1)))
attrs$edge$fontsize<-8
plot(g1, edgeAttrs = eAttrs, attrs=attrs)
我的尝试似乎都没有效果。有没有人有想法?
答案 0 :(得分:4)
在plot()
对象上调用graph
会调度S4方法(由getMethod("plot", "graph")
显示),然后通过键入getMethod("plot", "Ragraph")
来调用显示的函数。该函数包含以下相当不幸的行,无论您进行任何相关参数设置,都会覆盖它们以将左右边距重置为0.令人沮丧!
oldpars <- par(mai = c(sheight, 0, mheight, 0))
on.exit(par(oldpars), add = TRUE)
一个解决方法是构建一个三个面板layout
,其中左侧和右侧面板就在那里,以提供一些缓冲空间。关闭裁剪,在中间面板中绘制graph
对象,然后它似乎可以工作:
layout(matrix(1:3, nrow=1), widths=c(1,5,1))
par(xpd=NA) ## turn off all clipping
plot.new() ## blank plot in Panel 1
plot(g1, edgeAttrs = eAttrs) ## graph in Panel 2
plot.new() ## blank plot in Panel 3
答案 1 :(得分:0)
我找到了另一个解决方案:在我原来的问题中,我在agopen
得到的布局图中更改了边界框的大小。绘制布局图表显示没有边缘标签。我发现可以将图形对象的边缘属性传递给agopen
,然后更改边界框:
require('Rgraphviz')
set.seed(123)
g1 <- randomGraph(letters[1:10], 1:4, 0.4)
eAttrs <- list()
eAttrs$label <- c("a~g" = "I have a very long label 1", "a~i" = "and a long label 2")
z <- agopen(g1, "foo", edgeAttr=eAttrs)
z@boundBox@botLeft@x <- z@boundBox@botLeft@x - 400 ##left
z@boundBox@upRight@x <- z@boundBox@upRight@x + 200 ##right
plot(z)
情节: