在R中使用boxplot绘制多张图:如何合并箱线图?
当然可以!有几种实用的方法能把这两组箱线图合并到一张图里,我分基础R原生绘图和ggplot2包绘图两种主流方案给你讲解:
方法一:用基础R的多面板布局
基础R里可以通过par()函数设置画布布局,把多个图放在同一行或同一列。比如你想让两个箱线图并排显示,代码可以这么写:
# 设置画布为1行2列,一次性容纳两个图 par(mfrow = c(1, 2)) # 绘制第一个箱线图(品牌对比) boxplot(my.data$speed ~ my.data$`honda/toyota`, main = "Honda vs Toyota", ylab = "speed in km") # 绘制第二个箱线图(颜色对比) boxplot(my.data$speed ~ my.data$`red/blue`, main = "Red vs Blue", ylab = "speed in km") # 重置绘图参数(可选,避免影响后续的绘图操作) par(mfrow = c(1, 1))
如果想让两个图上下排列,只需要把mfrow = c(1, 2)改成mfrow = c(2, 1)就行。
方法二:用ggplot2包(更灵活美观)
如果你追求更精致的可视化效果,ggplot2是更好的选择,它有两种常见的合并方式:
方式1:分面展示(Facet)
先把数据整理成「长格式」,然后用分面功能把两个对比放在同一张图里:
library(ggplot2) library(tidyr) # 把宽格式数据转换为长格式,方便ggplot2处理 tidy_data <- my.data %>% pivot_longer( cols = c(`honda/toyota`, `red/blue`), names_to = "comparison_type", # 区分是品牌对比还是颜色对比 values_to = "group" # 具体分组(Honda/Toyota 或 Red/Blue) ) # 绘制分面箱线图 ggplot(tidy_data, aes(x = group, y = speed)) + geom_boxplot(fill = "#69b3a2") + # 自定义箱线图填充色 facet_wrap(~ comparison_type, nrow = 1) + # 1行排列两个分面 labs(y = "speed in km", title = "Speed Comparisons") + theme_minimal()
方式2:手动合并两个独立ggplot对象
如果你不想转换数据格式,可以先分别画出两个ggplot图,再用gridExtra包合并:
library(ggplot2) library(gridExtra) # 创建第一个图(品牌对比) p1 <- ggplot(my.data, aes(x = `honda/toyota`, y = speed)) + geom_boxplot() + labs(title = "Honda vs Toyota", y = "speed in km") + theme_bw() # 创建第二个图(颜色对比) p2 <- ggplot(my.data, aes(x = `red/blue`, y = speed)) + geom_boxplot() + labs(title = "Red vs Blue", y = "speed in km") + theme_bw() # 合并两个图到一行显示 grid.arrange(p1, p2, ncol = 2)
额外方案:把所有箱线图放在同一个面板
如果你想把四个分组(Honda、Toyota、Red、Blue)的箱线图直接放在同一个坐标轴下对比,可以先整理数据:
# 给每个分组添加类型标签,区分是品牌还是颜色 my.data$brand_group <- paste("Brand:", my.data$`honda/toyota`) my.data$color_group <- paste("Color:", my.data$`red/blue`) # 合并分组和速度数据 combined_data <- data.frame( group = c(my.data$brand_group, my.data$color_group), speed = c(my.data$speed, my.data$speed) ) # 绘制同一面板的箱线图 boxplot(speed ~ group, data = combined_data, ylab = "speed in km", main = "All Speed Comparisons", col = c("#ff9999", "#ff9999", "#99ccff", "#99ccff")) # 给同类型分组加相同颜色
内容的提问来源于stack exchange,提问作者mintyT




