如何用ggplot创建含水平垂直多嵌套分面的分组柱状图?
使用ggplot2绘制符合特定布局的垂直柱状图
步骤1:加载所需包并导入数据集
首先加载ggplot2包,然后将数据集读入R中:
library(ggplot2) # 导入数据集 df <- read.table(text = "Target Manner Vfront MedDor Mean p Stop front NA 0.60 p Stop back NA 0.59 p Stop front cor 0.58 p Stop back cor 0.56 p Stop front incor 0.52 p Stop back incor 0.52 p Stop front X 0.24 p Stop back X 0.52 b Stop front NA 0.42 b Stop back NA 0.39 b Stop front cor 0.37 b Stop back cor 0.42 b Stop front incor 0.36 b Stop back incor 0.33 b Stop front X 0.14 b Stop back X 0.39 f Fric front NA 0.27 f Fric back NA 0.23 f Fric front cor 0.19 f Fric back cor 0.40 f Fric front incor 0.13 f Fric back incor 0.32 f Fric front X 0.08 f Fric back X 0.13 v Fric front NA 0.24 v Fric back NA 0.18 v Fric front cor 0.17 v Fric back cor 0.11 v Fric front incor 0.25 v Fric back incor 0.16 v Fric front X 0.09 v Fric back X 0.16", header = TRUE, stringsAsFactors = FALSE)
步骤2:数据预处理
为满足排序和分组需求,将相关列转为指定顺序的因子:
# 指定MedDor的显示顺序:NA → cor → incor → X df$MedDor <- factor(df$MedDor, levels = c("NA", "cor", "incor", "X")) # 指定Target的顺序,保证Stop组显示p、b,Fric组显示f、v df$Target <- factor(df$Target, levels = c("p", "b", "f", "v")) # 创建Target与MedDor的组合标签,用于x轴的柱子标识 df$Target_MedDor <- paste0(df$Target, df$MedDor) # 按Manner、Vfront、Target、MedDor排序,确保绘图顺序正确 df <- df[order(df$Manner, df$Vfront, df$Target, df$MedDor), ]
步骤3:绘制柱状图
使用ggplot2实现需求布局:
ggplot(df, aes(x = Target_MedDor, y = Mean, fill = MedDor)) + # 绘制垂直柱状图 geom_bar(stat = "identity", width = 0.8) + # 按Manner分上下行,Vfront分左右列的分面布局 facet_grid(Manner ~ Vfront, scales = "free_x", space = "free_x") + # 调整x轴标签:让Target作为分组标题,每个Target下显示对应MedDor的柱子 scale_x_discrete( breaks = df$Target_MedDor[seq(1, nrow(df), 4)], labels = df$Target[seq(1, nrow(df), 4)], guide = guide_axis(n.dodge = 2) ) + # 为MedDor的不同类别设置区分度高的颜色 scale_fill_brewer(palette = "Set1") + # 设置图表标题和坐标轴标签 labs( title = "Mean值分组柱状图", x = "Target", y = "Mean", fill = "MedDor" ) + # 使用简洁主题并调整样式 theme_minimal() + theme( strip.text = element_text(size = 12, face = "bold"), axis.text.x = element_text(angle = 45, hjust = 1), legend.position = "bottom" )
关键设置说明
facet_grid(Manner ~ Vfront):实现**Manner分上下行(Stop在上、Fric在下),Vfront分左右列(front在左、back在右)**的布局,scales="free_x"和space="free_x"让每个分面的x轴自适应宽度,避免标签重叠。scale_x_discrete:调整x轴显示逻辑,让Target作为分组标题,每个分组下显示四个MedDor对应的柱子,匹配你预期的布局。- 因子顺序设置:通过指定
MedDor和Target的因子水平,确保绘图时的顺序完全符合需求。
内容的提问来源于stack exchange,提问作者heatheryawney
相关产品推荐
相关产品推荐

