gpt4 book ai didi

从 ggplot 或 gtable/gTree/grob/gDesc 对象中检索分面标签

转载 作者:行者123 更新时间:2023-12-04 10:52:50 28 4
gpt4 key购买 nike

我有正在使用 ggplotfacet_grid 绘制的数据:

我的数据:

species <- c("spcies1","species2")
conditions <- c("cond1","cond2","cond3")
batches <- 1:6

df <- expand.grid(species=species,condition=conditions,batch=batches)

set.seed(1)
df$y <- rnorm(nrow(df))
df$replicate <- 1
df$col.fill <- paste(df$species,df$condition,df$batch,sep=".")

我的情节:

integerBreaks <- function(n = 5, ...)
{
library(scales)
breaker <- pretty_breaks(n, ...)
function(x){
breaks <- breaker(x)
breaks[breaks == floor(breaks)]
}
}

library(ggplot2)
p <- ggplot(df,aes(x=replicate,y=y,color=col.fill))+
geom_point(size=3)+facet_grid(~col.fill,scales="free_x")+
scale_x_continuous(breaks=integerBreaks())+
theme_minimal()+theme(legend.position="none",axis.title=element_text(size=8))

给出: enter image description here

显然,标签很长,在图中显得很乱,所以我想知道是否有办法在 ggplot 对象 (p) 中编辑这些标签,或者gtable/gTree/grob/gDesc 对象 (ggplotGrob(p)) .

我知道获得更好标签的一种方法是使用 labeller function当创建 ggplot 对象时,但在我的例子中,我专门寻找一种在创建 ggplot 对象后编辑构面标签的方法。

最佳答案

正如我在评论中提到的,构面名称嵌套在 ggplotGrob() 提供给您的 gtable 中。然而,这仍然是可能的,因为 OP 明确希望在绘制后编辑它们,您可以这样做:

library(grid)
gg <- ggplotGrob(p)

edited_grobs <- mapply(FUN = function(x, y) {
x[["grobs"]][[1]][["children"]][[2]][["children"]][[1]][["label"]] <- y
return(x)
},
gg$grobs[which(grepl("strip-t",gg$layout$name))],
unique(gsub("cond","c", df$condition)),
SIMPLIFY = FALSE)

gg$grobs[which(grepl("strip-t",gg$layout$name))] <- edited_grobs
grid.draw(gg)

enter image description here

请注意,这会使用 gg$grobs[which(grepl("strip-t",gg$layout$name))] 提取所有 strip 并将它们传递给 mapply 将使用 OP 在评论中指定的 gsub(...) 进行重置。

一般来说,如果您只想访问其中一个文本标签,我在我的 mapply 中使用了一个非常相似的结构:

num_to_access <- 1
gg$grobs[which(grepl("strip-t",gg$layout$name))][[num_to_access]][["grobs"]][[1]][["children"]][[2]][["children"]][[1]]$label

例如,要访问第 4 个标签,您需要做的就是将 num_to_acces 更改为 4。希望这对您有所帮助!

关于从 ggplot 或 gtable/gTree/grob/gDesc 对象中检索分面标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46516269/

28 4 0