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

如何在facet_grid生成的第二个子图中添加次Y轴

解决思路:给facet_grid单个子图添加右侧Y轴

首先得明确:ggplot原生的facet系统不支持单独给某个分面子图添加副轴,因为分面是基于同一图层的全局设置,副轴会应用到所有分面。所以我们需要换个思路——把两个分面拆成独立的绘图,再用拼接工具组合起来,这样就能给第二个图单独加右侧Y轴了。

下面是具体的实现步骤,先修正你提供的数据集(原数据中agrup的长度和其他列不匹配,我调整成正确的格式):

步骤1:准备数据

# 修正后的数据集
dat <- data.frame(
  agrup = rep(as.factor(c("1ª a 11ª SE", "12ª a 16ª SE", "17ª a 21ª SE", "22ª a 26ª SE")), 4),
  CLASSI_FIN = rep(c("SRAG-COVID", "SRAG-não especificada"), each = 4, times = 2),
  valores = c(10,121,278,924,358,1373,1146,832,2,26,49,110,18,177,166,106),
  var = rep(c("Número de Internados", "Número de Óbitos"), each = 8)
)

# 定义x轴顺序(匹配你代码中的positions变量)
positions <- c("1ª a 11ª SE", "12ª a 16ª SE", "17ª a 21ª SE", "22ª a 26ª SE")

步骤2:拆分数据集并绘制独立图表

我们用patchwork包来拼接图表(如果没安装先运行install.packages("patchwork")):

绘制第一个子图(住院数)

library(ggplot2)

p1 <- ggplot(subset(dat, var == "Número de Internados")) +
  geom_bar(aes(x = agrup, y = valores, fill = CLASSI_FIN),
           color = "transparent", position = "dodge", stat = "identity") +
  scale_fill_manual("", c("SRAG-COVID", "SRAG-não especificada"), 
                    values = c("dodgerblue3", "gold")) +
  scale_x_discrete(limits = positions) +
  theme(
    axis.text.x = element_text(angle = 90, hjust = 1),
    axis.text.y = element_text(color = "black"),
    panel.background = element_blank(),
    legend.position = "none" # 先隐藏图例,后面统一添加
  ) +
  labs(x = "", y = "") +
  ggtitle("Número de Internados")

绘制第二个子图(死亡数,添加右侧Y轴)

这里我们添加一个和住院数同比例的右侧轴,方便直观对比两个指标的数值差异:

# 计算缩放比例:住院数最大值 / 死亡数最大值
scale_factor <- max(subset(dat, var == "Número de Internados")$valores) / 
  max(subset(dat, var == "Número de Óbitos")$valores)

p2 <- ggplot(subset(dat, var == "Número de Óbitos")) +
  geom_bar(aes(x = agrup, y = valores, fill = CLASSI_FIN),
           color = "transparent", position = "dodge", stat = "identity") +
  scale_fill_manual("", c("SRAG-COVID", "SRAG-não especificada"), 
                    values = c("dodgerblue3", "gold")) +
  scale_x_discrete(limits = positions) +
  # 添加右侧Y轴:将死亡数按比例缩放,对应住院数的数值范围
  scale_y_continuous(
    sec.axis = sec_axis(~ . / scale_factor, name = "Escala correspondente aos internados")
  ) +
  theme(
    axis.text.x = element_text(angle = 90, hjust = 1),
    axis.text.y = element_text(color = "black"),
    axis.text.y.right = element_text(color = "black"),
    panel.background = element_blank(),
    legend.position = "none"
  ) +
  labs(x = "", y = "") +
  ggtitle("Número de Óbitos")

步骤3:拼接两个图表并统一样式

library(patchwork)

# 并排拼接两个图,共享底部图例
p1 + p2 +
  plot_layout(ncol = 2) +
  plot_annotation(theme = theme(legend.position = "bottom")) &
  guides(fill = guide_legend(title = ""))

其他可选思路

如果你不想拆分绘图,也可以试试ggh4x包的facet_grid2函数,它支持更灵活的分面轴设置,但拆分绘图的方式更直观,也更容易调试样式。

内容的提问来源于stack exchange,提问作者Amanda SB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:03:11