如何解决打印列表中存储的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]])
}
输出:
,问题在于您的[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 举报,一经查实,本站将立刻删除。