制作一个ggplot箱线图,其中每列都是它自己的箱线图

Posted

技术标签:

【中文标题】制作一个ggplot箱线图,其中每列都是它自己的箱线图【英文标题】:Making a ggplot boxplot where each column is it's own boxplot 【发布时间】:2021-09-07 03:38:54 【问题描述】:

当使用简单的R boxplot函数时,我可以很容易地将我的数据框直接放入括号中,一个完美的boxplot就出现了,例如:

baseline <- c(0,0,0,0,1)
post_cap <- c(1,5,5,6,11)
qx314 <- c(0,0,0,3,7)
naive_capqx <- data.frame(baseline, post_cap, qx314)
boxplot(naive_capqx)

this is an image of the boxplot made with the simple R boxplot function

但是,我需要让这个箱线图更美观一些,所以我需要使用 ggplot。当我将数据框本身放入时,箱线图无法形成,因为我需要指定我没有的 x、y 和填充坐标。我的 y 坐标是数据框中每个向量的值,我的 x 坐标只是向量的名称。如何使用 ggplot 做到这一点?有没有办法改革我的数据框,以便我可以将其拆分为坐标,或者有没有办法 ggplot 可以读取我的数据?

【问题讨论】:

【参考方案1】:

geom_boxplot 需要 tidy 数据。您的数据不整洁,因为列名包含信息。所以首先要做的就是使用pivot_longer整理你的数据...

library(tidyverse)

naive_capqx %>%  
  pivot_longer(everything(), values_to="Value", names_to="Variable") %>% 
  ggplot() +
  geom_boxplot(aes(x=Variable, y=Value))

给予

【讨论】:

嗨,我尝试使用此代码,但我的 R 无法破译 %>%。这是一个我可能没有加载的单独包吗? %&gt;% 是 magrittr 包的一部分,该包包含在 tidyverse 元包中。我的代码是 MWE,应该按原样运行。如果您愿意,可以通过将naive_capqx %&gt;% pivot_longer(everything()... 替换为pivot_longer(naive_capqx, everything()... 来避免使用%&gt;%。请注意,@RebeccaAmodeo 的解决方案虽然正确,但使用了 gather(),它已被 pivot_XXXX 函数取代。【参考方案2】:

将 df 转换为长格式 df。下面,我使用gather() 来加长df;我使用group_by() 确保通过键(以前的列名)计算箱线图。

pacman::p_load(ggplot2, tidyverse)

baseline <- c(0,0,0,0,1)
post_cap <- c(1,5,5,6,11)
qx314 <- c(0,0,0,3,7)

naive_capqx <- data.frame(baseline, post_cap, qx314) %>%
  gather("key", "value")) %>%
  group_by(key)
  

ggplot(naive_capqx, mapping = aes(x = key, y = value)) +
  geom_boxplot()

【讨论】:

嗨,对不起,%>% 是什么意思?我的 R 听不懂! 嗨@NuritEliana,感谢您的提问!它是一种称为“管道”的运算符。它发送之前的任何内容(在其左侧)并将其发送到下一个命令。它消除了在其后的命令中输入 data 参数的需要,因为 R 将知道管道之前的对象是您想要用作 data 参数的对象。我认为这就像对 R 说“然后”。它最初位于magrittr 包中,并包含在dplyrtidyverse 包以及R 4.1 中。它节省了很多打字!一个video。希望有帮助!

以上是关于制作一个ggplot箱线图,其中每列都是它自己的箱线图的主要内容,如果未能解决你的问题,请参考以下文章

同一图上 Pandas 数据框多列的箱线图(seaborn)

格式化在 ggplot 的箱线图中显示为文本的数字。解释箱线图外均值的定位

如何在ggplot的箱线图中按组绘制平均值

ggplot2 不会将图例添加到具有多个层的箱线图

ggplot2 按第 80 个百分位重新排列我的箱线图

使用ggplot2画基因表达样本的箱线图