R 在一个图中绘制来自不同数据帧的箱线图
R Plot boxplots from different Dataframes in one plot
我正要分析一些数据并坚持可视化,现在无法取得任何进展。
所以,这是与我使用的类似的虚拟数据帧:
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 选择什么。也许我只是想的太复杂了,但是是的...我缺少一些 link。
所以我希望一切都是可以理解的,如果缺少信息,请直接提问,我会添加!
也许这就是您要找的。要通过 ggplot2 复制基础 R 箱线图,您可以
- 将你的 df 放入列表中
- 将 df 转换为我使用
lapply
的长格式和一个辅助函数
- 使用
tidyr::pivot_longer
将 df 转换为长格式
- 使用
forcats::fct_inorder
将具有变量名的列转换为因子并保留原始 df 中的正确顺序。
- 使用例如将长 df 绑定到一个数据帧中
dplyr::bind_rows
我在其中添加了一个 id 变量
- 经过数据整理后,通过 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()
我正要分析一些数据并坚持可视化,现在无法取得任何进展。
所以,这是与我使用的类似的虚拟数据帧:
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 选择什么。也许我只是想的太复杂了,但是是的...我缺少一些 link。
所以我希望一切都是可以理解的,如果缺少信息,请直接提问,我会添加!
也许这就是您要找的。要通过 ggplot2 复制基础 R 箱线图,您可以
- 将你的 df 放入列表中
- 将 df 转换为我使用
lapply
的长格式和一个辅助函数- 使用
tidyr::pivot_longer
将 df 转换为长格式
- 使用
forcats::fct_inorder
将具有变量名的列转换为因子并保留原始 df 中的正确顺序。
- 使用
- 使用例如将长 df 绑定到一个数据帧中
dplyr::bind_rows
我在其中添加了一个 id 变量 - 经过数据整理后,通过 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()