如何使用循环函数在同一张图上创建多个 ggboxplots?

How to create multiple ggboxplots on the same graph using the loop function?

TL;DR:尝试使用循环函数在一张图中使用 ggboxplot 创建多个箱线图(附图)。当前为每个箱线图手动创建代码,然后使用 ggarrange()par() 函数将它们绘制在一起。它有效,但正在寻找一种重复性较低的方法。

我想知道是否可以使用循环函数创建多个 ggboxplot。我在 Whosebug 上看到了多个 replies/solutions,但其中 none 非常准确地捕获了我正在寻找的解决方案(或者通常不需要使用循环函数)。

我的数据看起来像这样:

# A tibble: 62 x 4
   offer payoff  partner_transfer  round_type
   <dbl>  <dbl>       <dbl>         <chr>     
 1    40    126        66           actual    
 2   100    273       273           actual    
 3     0    100        0            actual    
 4   100      6        6            actual    
 5    25     99       24            actual    
 6    80     29        9           practice    
 7   100     45       45           practice    
 8     0    100        0           practice    
 9    25     99       24           practice    
10   100    183       183          practice    
# ... with 52 more rows

我试图得到的输出是这样的:

我是通过运行多个代码得到的,然后使用ggarrange()函数组合它们(下):

box_offer <- ggboxplot(data = tg_proposer_split, x = "round_type", y = "offer",
                   fill = "round_type",
                   palette = "ucscgb",
                   ylab = "Offer (by A)", xlab = "Round Type",
                   add = "jitter",
                   shape = "round_type")

box_partner_transfer <- ggboxplot(data = tg_proposer_split, x = "round_type", y = "partner_transfer",
                   fill = "round_type",
                   palette = "ucscgb",
                   ylab = "Amount Transferred by Partner (Bot)", xlab = "Round Type",
                   add = "jitter",
                   shape = "round_type")

box_payoff <- ggboxplot(data = tg_proposer_split, x = "round_type", y = "payoff",
                       fill = "round_type",
                       palette = "ucscgb",
                       ylab = "Payoff (for A)", xlab = "Round Type",
                       add = "jitter",
                       shape = "round_type")

ggarrange(box_offer, box_partner_transfer, box_payoff, 
          labels = c("A", "B", "C"),
          ncol = 2, nrow = 2)

我要解决这个问题的另一种方法是使用 par() 函数(但要绘制均值)。图片在这里:

我使用的代码是:

par(mfrow = c(2,2))

plot_offer <- plotmeans( offer ~ round_type, data = tg_proposer_split,
          xlab = "Round Type", ylab = "Offer (by A)",
          main="Mean Plot with 95% CI") 

plot_partner_transfer <- plotmeans( partner_transfer ~ round_type, data = tg_proposer_split,
          xlab = "Round Type", ylab = "Amount Transferred by Partner (Bot)",
          main="Mean Plot with 95% CI") 

plot_payoff <- plotmeans( payoff ~ round_type, data = tg_proposer_split,
          xlab = "Round Type", ylab = "Payoff (for A)",
          main="Mean Plot with 95% CI") 

虽然使用 ggarrange()par() 都能满足我的需求,但它有点太麻烦了,因为有时我有超过 10 个 columns/variables 我想为其创建箱线图.因此,如果有更短的方法来获得我想要的输出而不在我的代码中重复,我想在这里找到一些运气。我不确定问题是否出在我组织数据集的方式上,这让这个过程变得困难,但无论哪种方式,我都愿意接受不同的解决方案。

您可以使用 Map 创建地块列表并使用 ggarrange 绘制它。分别传递列名和 y 标签。

library(ggpubr)

cols <- setdiff(names(tg_proposer_split), 'round_type')
y_labels <- c("Offer (by A)", "Amount Transferred by Partner (Bot)", "Payoff (for A)")

Map(function(x, y) {
  ggboxplot(data = tg_proposer_split, x = "round_type", y = x,
            fill = "round_type",
            palette = "ucscgb",
            ylab = y, xlab = "Round Type",
            add = "jitter",
            shape = "round_type")
}, cols, y_labels) -> list_plots

ggarrange(plotlist = list_plots, common.legend = TRUE)

数据

tg_proposer_split <- structure(list(offer = c(40L, 100L,0L,100L, 25L, 80L,100L, 
0L, 25L, 100L), payoff = c(126L, 273L, 100L, 6L, 99L, 29L, 45L, 
100L, 99L, 183L), partner_transfer = c(66L, 273L, 0L, 6L, 24L, 
9L, 45L, 0L, 24L, 183L), round_type = c("actual", "actual", "actual", 
"actual", "actual", "practice", "practice", "practice", "practice", 
"practice")), class = "data.frame", row.names = c(NA, -10L))