3

我正在尝试绘制一个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. 减小标签字体大小(无论如何,这并不是我想要的应用程序)

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)

我的尝试似乎都没有奏效。有人有想法吗?

4

2 回答 2

5

问题

调用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

在此处输入图像描述

于 2013-05-15T17:25:16.953 回答
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)

剧情:

在此处输入图像描述

于 2013-05-16T12:48:35.333 回答