2

如果我有一个尚未绘制的 gList,我可以修改其中的文本吗?

例子:

library('VennDiagram')
temp <- venn.diagram(list(A=0,B=0),euler.d=FALSE, scale=FALSE, filename=NULL)

这里 temp 是一个未绘制的 gList,我可以通过

grid.draw(temp)

但是,如果我想在绘制之前但在创建 gList 对象之后修改文本对象(包括 nubers)怎么办。例如,我可以在创建 gList 后更改维恩图中的值吗?

我知道如果我先绘制维恩图,我可以使用 grid.edit() 来完成,但这不是一个选项。

str(temp)

这是我要更改的 ..$ 标签。

提前 - 谢谢。

4

2 回答 2

1

你可以做到,但这有点麻烦。另外我不知道您是否可以一次将一个列表子集化为多个元素,因此您可能必须单独手动更改每个标签。基本上我检查了绘图,然后查看了temp对象的结构,并找到了标签存储在对象中的位置。然后,我得到了实际上是文本对象的列表元素的索引,并使用子集将它们编辑为其他内容。唯一的事情是我发现我必须一次做每一个,如果你有很多,这会很痛苦。你可以试试这个,我希望它有帮助:

unlist( sapply(temp,'[[',"label") )
[1] "0" "0" "1" "A" "B"

# Make index of which top-level elements of list are text elements
x <- !sapply( sapply(temp,'[[',"label") , is.null )
ind <- seq.int(length(x))
ind <- ind[x]


# Subset and change each one in place
`[[`(`[[`( temp , ind[1] ), "label") <- "WAS"
`[[`(`[[`( temp , ind[2] ), "label") <- "BY"
`[[`(`[[`( temp , ind[3] ), "label") <- "CHANGED"
`[[`(`[[`( temp , ind[4] ), "label") <- "THIS"
`[[`(`[[`( temp , ind[5] ), "label") <- "ME"

# Plot with new labels
grid.draw(temp)

在此处输入图像描述

于 2013-04-16T15:31:40.227 回答
1

不幸的是,该软件包没有遵循网格建议以使通过名称等轻松访问 grobs。

在交互式会话中,您可以使用 找到显示列表中的名称grid.ls(),您可以执行以下操作:

venn <- gTree(children=temp, name="venn")
grid.edit("venn::GRID.text.17", label="this is a new label")

(显然 17 在给定状态下对我的会话是唯一的;未命名的 grobs 由网格自动索引)

如果有一个一致的(可重现的)命名方案,您可以定义自己的包装gTree方法来递归地编辑子标签。gListeditDetails

于 2013-04-17T12:01:48.680 回答