首页 > 解决方案 > 如何使用循环函数在同一个图上创建多个 ggboxplots?

问题描述

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

我想知道是否可以ggboxplot使用循环函数创建多个 s 。我在 StackOverflow 上看到了多个回复/解决方案,但没有一个非常准确地捕获了我正在寻找的解决方案(或者通常不需要使用循环函数)。

我的数据看起来像这样:

# 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()函数(但要绘制手段)。图片在这里:

plotmeans 样本

我用于此的代码是:

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 个列/变量要为其创建箱线图。因此,如果有一种更短的方法来获得我想要的输出而不会在我的代码中重复,我会尝试在这里找到一些运气。我不确定问题是否在于我组织数据集的方式使这个过程变得困难,但无论哪种方式,我都愿意接受不同的解决方案。

标签: rloopsboxplotggpubr

解决方案


您可以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))

推荐阅读