首页 > 解决方案 > R在一个图中绘制来自不同数据框的箱线图

问题描述

我即将分析一些数据并坚持可视化,现在无法取得任何进展。

所以,这里有一些类似于我使用的虚拟数据帧:

df1<-data.frame(replicate(15,sample(0:200,1500,rep=TRUE)))
df2<-data.frame(replicate(15,sample(0:200,1500,rep=TRUE)))
df3<-data.frame(replicate(36,sample(0:200,1500,rep=TRUE)))
df4<-data.frame(replicate(9,sample(0:200,1500,rep=TRUE)))

问题如下

我想将每个 Dataframe 的箱线图作为一个整体绘制:以便 df1、df2、df3 和 df4 的箱线图在一个图中彼此并排。我不想在这个箱线图中拥有每个站点,而是将数据框作为一个整体。

每个数据框的箱线图工作顺利:

boxplot(df1, las=2)
boxplot(df2, las=2)
boxplot(df3, las=2)
boxplot(df4, las=2)

然后我尝试将它们组合在一起 ggplot:

ggplot(data = NULL, aes(x, y))+
  geom_boxplot(data = df1, aes())+
  geom_boxplot(data = df2, aes())+
  geom_boxplot(data = df3, aes())+
  geom_boxplot(data = df4, aes())

但是在这里我收到一条错误消息

Fehler in FUN(X[[i]], ...) : Objekt 'x' nicht gefunden

aes() 有问题,这很明显,但我不知道我可以为 x 和 y 选择什么。也许我只是以一种过于复杂的方式思考,但是是的......我缺少一些链接。

所以我希望一切都是可以理解的,如果信息缺失,那么只要问我就会添加它!

标签: rdataframeggplot2boxplot

解决方案


也许这就是你要找的。要通过 ggplot2 复制基本 R 箱线图,您可以

  1. 把你的df放在一个列表中
  2. 将 df 转换为我使用的长格式lapply和一个辅助函数
    • 使用将 df 转换为长格式tidyr::pivot_longer
    • 用于forcats::fct_inorder将具有变量名称的列转换为因子并保留原始 df 中的正确顺序。
  3. dplyr::bind_rows使用例如我添加一个 id 变量的地方将长 df 绑定到一个数据帧中
  4. 在数据争吵之后,通过 ggplot2 制作箱线图是一项简单的任务,因此我选择了 df 刻面。
library(ggplot2)
library(tidyr)
library(dplyr)

df1<-data.frame(replicate(15,sample(0:200,1500,rep=TRUE)))
df2<-data.frame(replicate(15,sample(0:200,1500,rep=TRUE)))
df3<-data.frame(replicate(36,sample(0:200,1500,rep=TRUE)))
df4<-data.frame(replicate(9,sample(0:200,1500,rep=TRUE)))

df <- list(df1, df2, df3, df4)

to_long <- function(x) {
  pivot_longer(x, everything()) %>% 
    mutate(name = forcats::fct_inorder(name))
}
df <- lapply(df, to_long)
df <- bind_rows(df, .id = "id")

ggplot(df, aes(name, value)) +
  geom_boxplot() +
  facet_wrap(~id, scales = "free_x")

编辑要获得数据框所有列的箱线图和并排的箱线图,您可以这样做

ggplot(df, aes(id, value)) +
  geom_boxplot()


推荐阅读