如果我有一个我尚未绘制的gList,我可以修改其中的文本。
示例:
library('VennDiagram')
temp <- venn.diagram(list(A=0,B=0),euler.d=FALSE, scale=FALSE, filename=NULL)
这里的temp是一个未开槽的gList,我可以用
绘图grid.draw(temp)
但是如果我想在绘制之前修改文本对象(包括nubers),但是在创建gList对象之后。例如,我可以在创建gList后更改维恩图中的值吗?
我知道如果先绘制维恩图,我可以用grid.edit()来做,但这不是一个选项。
在
str(temp)
这是我想改变的.. $标签。
提前 - 谢谢。
答案 0 :(得分: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)
答案 1 :(得分:1)
不幸的是,该软件包不遵循网格建议,以便通过名称等方便地访问grob。
在交互式会话中,您可以使用grid.ls()
在显示列表中找到名称,您可以执行以下操作:
venn <- gTree(children=temp, name="venn")
grid.edit("venn::GRID.text.17", label="this is a new label")
(显然17在给定状态下我的会话是唯一的;未命名的grob由网格自动索引)
如果存在一致(可重现)的命名方案,您可以使用gTree
方法定义自己的gList
包裹editDetails
,以递归方式编辑子标签。