制作一个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 无法破译 %>%。这是一个我可能没有加载的单独包吗?%>%
是 magrittr 包的一部分,该包包含在 tidyverse 元包中。我的代码是 MWE,应该按原样运行。如果您愿意,可以通过将naive_capqx %>% pivot_longer(everything()...
替换为pivot_longer(naive_capqx, everything()...
来避免使用%>%
。请注意,@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
包中,并包含在dplyr
和tidyverse
包以及R 4.1 中。它节省了很多打字!一个video。希望有帮助!以上是关于制作一个ggplot箱线图,其中每列都是它自己的箱线图的主要内容,如果未能解决你的问题,请参考以下文章
同一图上 Pandas 数据框多列的箱线图(seaborn)