gpt4 book ai didi

r - 在循环中调用用户定义的函数以在 ggplot2 中生成自定义图

转载 作者:行者123 更新时间:2023-12-05 03:52:03 25 4
gpt4 key购买 nike

这是为我的问题提供上下文的示例数据集:

df <- tibble(x1 = factor(sample(letters[1:6], 50, replace = T), levels=letters[1:6]),
x2 = factor(sample(letters[1:6], 50, replace = T), levels=letters[1:6]),
x3 = factor(sample(letters[1:6], 50, replace = T), levels=letters[1:6]),
)

head(df)

我编写了以下函数来生成我想在 ggplot2::ggplot() 调用中使用的新小标题:


plot_data_prep <- function(dsn, pvar){

pvar <- enquo(pvar)


#convert the new plot_df and get it ready for plotting.
plot_data <- dsn %>%
group_by(!!pvar) %>% count(.drop = F) %>% ungroup() %>%
mutate(pct = n/sum(n)*100,
pct_lab = paste0(format(pct, digits = 1),'%'),
pct_pos = pct + 0.6)

return(plot_data)

}

plot_data_prep(df, x3)

当我制作单独的图时,我可以使用这个用户定义的函数:


ggplot(plot_data_prep(df,x3), mapping = aes(x=x3, y=pct))+
geom_bar(stat = 'identity') +
geom_text(aes(x = x3, y = pct_pos, label = pct_lab ))

但是当我尝试循环遍历数据帧“df”中的变量“x1”、“x2”和“x3”时,使用我的 plot_data_prep() 函数为每个变量生成单独的图,我得到一个错误: '错误:i 列未知'


df_names <- names(df)

for (i in df_names){
plot <- ggplot(plot_data_prep(df, i), mapping = aes_string(x=i, y='n')) +
geom_bar(stat = 'identity') +
geom_text(aes(x = i, y = pct_pos, label = pct_lab ))

print(plot)
}

我希望有人能够帮助我理解为什么我的 for 循环索引变量“i”没有按照我需要的方式解析以使我的代码正常工作。

谢谢。

最佳答案

更改您的函数以接受字符串输入。

library(dplyr)
library(ggplot2)
library(rlang)

plot_data_prep <- function(dsn, pvar){

#convert the new plot_df and get it ready for plotting.
plot_data <- dsn %>%
group_by(!!sym(pvar)) %>% count(.drop = F) %>% ungroup() %>%
mutate(pct = n/sum(n)*100,
pct_lab = paste0(format(pct, digits = 1),'%'),
pct_pos = pct + 0.6)

return(plot_data)

}

确认有效:

plot_data_prep(df, 'x1')

现在您可以遍历名称并将绘图存储在列表中。

df_names <- names(df)
plot_list <- vector('list', length(df_names))

for (i in seq_along(df_names)) {
plot <- ggplot(plot_data_prep(df, df_names[i]),
mapping = aes(x= !!sym(df_names[i]), y=n)) +
geom_bar(stat = 'identity') +
geom_text(aes(x = !!sym(df_names[i]), y = pct_pos, label = pct_lab ))
plot_list[[i]] <- plot
print(plot)
}

可以通过执行 plot_list[[1]]plot_list[[2]] 等访问各个图。

关于r - 在循环中调用用户定义的函数以在 ggplot2 中生成自定义图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62419931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com