You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:57:47