微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

打印列表中存储的ggplot对象时,构面标签未保留

如何解决打印列表中存储的ggplot对象时,构面标签未保留

这是我将用来为我的问题提供背景信息的数据:

library(dplyr)
library(tidyr)
library(ggplot2)

set.seed(1)
f1 <- sample(c(letters[1:3],NA),100,prob = c(rep((0.9/3),times = 3),0.1),replace = T)
f2 <- sample(c(letters[1:3],prob = c(rep((0.8/3),0.2),replace = T)
f3 <- sample(c(letters[1:3],prob = c(rep((0.95/3),0.01),replace = T)

sample_dat <- tibble(
  x1 = factor(f1,level=letters[1:3]),x2 = factor(f2,x3 = factor(f3,grpA = factor(sample(c("grp1","grp2"),prob=c(0.3,0.7),replace=T),levels = c("grp1","grp2"))
  
)

sample_dat

这是我创建的用于准备绘图数据的函数

plot_data_prepr <- function(dat,groupvar,mainvar){
  
  groupvar <- sym(groupvar)
  mainvar <- sym(mainvar)
  
  plot_data <- dat %>% 
    group_by(!!groupvar) %>% 
    count(!!mainvar,.drop = F) %>% drop_na() %>% 
    mutate(pct = n/sum(n),pct2 = ifelse(n == 0,0.005,n/sum(n)),grp_tot = sum(n),pct_lab = paste0(format(pct*100,digits = 1),'%'),pct_pos = pct2 + .02)
  
  return(plot_data)
}

这是该函数的应用程序,用于生成将用于绘图的数据集

plot_data_prepr(dat = sample_dat,groupvar = "grpA",mainvar = "x1")
plot_data_prepr(dat = sample_dat,mainvar = "x2")
plot_data_prepr(dat = sample_dat,mainvar = "x3")

在这里,我使用一个for循环来绘制数据并动态更改构面的标签-如果在 rstudio作为RMarkdown文件,可以看到生成了图,并且构面的标签是 每一个不同之处,都应赋予它们不同程度的缺失和采样密度 “ grpA”变量。

plot_list <- vector('list',length = 0)

for (fct in names(sample_dat)[1:3]){
  
  mvar <- fct
  smvar <- sym(mvar)
  
  gvar <- "grpA"
  sgvar <- sym(gvar)
  
  
dd <- plot_data_prepr(dat = sample_dat,groupvar = gvar,mainvar = mvar)

pre_lookup <- dd %>% 
  select(!!sgvar,grp_tot) %>% 
  group_by(!!sgvar) %>% 
  summarise(lookup = mean(grp_tot))


lookup <- pre_lookup$lookup

  my_label <- function(x) {
    var <- names(x)[1]
    list(paste0(x[[var]]," (N = ",lookup,")"))
  }
  
  
  plot <- ggplot(dd,mapping = aes(x=!!smvar,y = pct2,fill = !!smvar)) +
    geom_bar(stat = 'identity') +
    ylim(0,1.3) +
    geom_text(aes(x=!!smvar,label=pct_lab,y = pct_pos + .02)) +
    facet_grid(as.formula(paste0(".~",gvar)),labeller = my_label) +
    ggtitle(paste(gvar,"by",mvar))
  
  plot_list[[fct]] <- plot
  
  print(plot)

}

这是我的问题-当我打印存储在列表中的图时, 他们似乎都保留了上一个情节中的构面标签,而不是保留 它们最初生成显示的独特的方面标签

for (name in names(sample_dat)[1:3]){
  print(plot_list[[name]])
}

基本上,我希望能够从列表中打印图 当我需要它们并让它们显示其独特的方面标签时 就像它们最初制作时所显示的一样。

社区中有人可以帮助我吗?

解决方法

我建议您尝试避免情节建设的循环。它可以用来创建标签或数据等问题。在这里,我将您的循环打包到一个函数中,并将结果存储在列表中。另外,您可以将lapply()与数据名称一起使用,以便直接使用绘图创建列表。这里的代码:

#Function for plot
myplotfun <- function(fct)
{
  mvar <- fct
  smvar <- sym(mvar)
  
  gvar <- "grpA"
  sgvar <- sym(gvar)
  
  
  dd <- plot_data_prepr(dat = sample_dat,groupvar = gvar,mainvar = mvar)
  
  pre_lookup <- dd %>% 
    select(!!sgvar,grp_tot) %>% 
    group_by(!!sgvar) %>% 
    summarise(lookup = mean(grp_tot))
  
  
  lookup <- pre_lookup$lookup
  
  
  my_label <- function(x) {
    var <- names(x)[1]
    list(paste0(x[[var]]," (N = ",lookup,")"))
  }
  
  
  plot <- ggplot(dd,mapping = aes(x=!!smvar,y = pct2,fill = !!smvar)) +
    geom_bar(stat = 'identity') +
    ylim(0,1.3) +
    geom_text(aes(x=!!smvar,label=pct_lab,y = pct_pos + .02)) +
    facet_grid(as.formula(paste0(".~",gvar)),labeller = my_label) +
    ggtitle(paste(gvar,"by",mvar))
  
  return(plot)
}

现在,我们创建一个列表:

#Create a list
plot_list <- lapply(names(sample_dat)[1:3],myplotfun)

最后,您在上一个循环中使用的绘图:

#Loop
for (i in 1:length(plot_list)){
  plot(plot_list[[i]])
}

输出:

enter image description here

enter image description here

enter image description here

,

问题在于您的[K in keyof T & string as `set_${K}`] 函数有一个自由变量interface Capitals { a: 'A',b: 'B',c: 'C' /* ... */,p: 'P' } type Capitalize<T extends string> = T extends `${infer First}${infer Rest}` ? First extends keyof Capitals ? `${Capitals[First]}${Rest}` : T : T type SetterName<T extends string> = `set${Capitalize<T>}` type SetPropName = SetterName<'propName'> // type: "setPropName" ,只有在您实际绘制函数时才能解决。在for循环运行之后,您仅包含循环中的最后一个值。要捕获当前回路值,可以将其放置在机柜中。因此,您可以将my_label函数更改为

lookup

,然后致电my_label

  my_labeler <- function(lookup) {
    function(x) {
      var <- names(x)[1]
      list(paste0(x[[var]],")"))
    }
  }

但是我同意@Duck的观点,在这种情况下避免for循环会更容易。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。