如何在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
相关产品推荐
相关产品推荐

