如何使用循环功能在同一张图上创建多个ggboxplots? [英] How to create multiple ggboxplots on the same graph using the loop function?

查看:82
本文介绍了如何使用循环功能在同一张图上创建多个ggboxplots?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

TL; DR:尝试使用循环功能在一张图中使用 ggboxplot 创建多个盒形图(已附加图像).当前,为每个箱线图手动创建代码,然后使用 ggarrange() par()函数将它们绘制在一起.它可以工作,但是正在寻找一种不太重复的方法.

TL;DR: Trying to create multiple boxplots using ggboxplot in one graph (images attached), using loop function. Currently manually creating codes for each boxplot, then using either ggarrange() or par() function to plot them together. It works, but looking for a less repetitive way.

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

I was wondering if it's possible to create multiple ggboxplots using a loop function. I've seen multiple replies/solutions on StackOverflow but none of them quite accurately captured the solution I was looking for (or that it generally was not necessary to use a loop function).

我的数据看起来像这样:

My data looks something like this:

# 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

我想要获得的输出是这样:

The output I'm trying to get is this:

我能够通过运行多个代码,然后使用 ggarrange()函数将它们组合在一起(如下)来实现:

I was able to get that by running multiple codes, and then using ggarrange() function to combine them (below):

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()函数(但要绘制平均值).图片在这里:

Another way that I'm going about this is by using the par() function (but to plot means). Image here:

我用于此的代码是:

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

While using either ggarrange() or par() gives me exactly what I want, it's a bit too cumbersome, as sometimes I have over 10 columns/variables that I want to create boxplots for. Hence I'm trying to find some luck here if there is a shorter way to get the output I want without being repetitive in my code. I'm not sure if the problem lies in the way I organised my dataset that is making this process difficult but either way, I'm open to different solutions.

推荐答案

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

You can use Map to create list of plots and use ggarrange to plot it. Pass column names and y-labels separately.

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))

这篇关于如何使用循环功能在同一张图上创建多个ggboxplots?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆