如何在ggplot中生成带反转Y轴与指定ylim的分面堆叠柱状图
问题描述
需要生成带反转Y轴和指定Y轴范围的分面堆叠柱状图。使用代码时,Y轴已反转,但ylim设置未生效;未反转Y轴时,ylim可正常生效。
数据如下:
df <- structure(list(z = c("up", "up", "up", "up", "up", "up", "down", "down", "down", "down", "down", "down"), x = c("C", "C", "G", "G", "H", "H", "C", "C", "G", "G", "H", "H"), w = c("more", "less", "more", "less", "more", "less", "more", "less", "more", "less", "more", "less"), y = c(5, 6, 4, 4, 50, 42, 50, 16, 24, 8, 83, 99)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -12L))
出错代码:
ggplot(df, aes(x, y, fill=w))+geom_bar(stat='identity')+ facet_wrap(~z, scales="free_y", ncol = 1) +xlab('a')+ylab('b')+theme(panel.background = element_blank(),axis.text = element_text(size = 8, color = 'black'), text = element_text(size = 8),plot.title = element_text(hjust = 0.5))+ggtitle('T')+ ylim(0,500)+scale_y_continuous(trans="reverse")
未反转时正常生效的代码:
ggplot(df, aes(x, y, fill=w))+geom_bar(stat='identity')+ facet_wrap(~z, scales="free_y", ncol = 1) +xlab('a')+ylab('b')+theme(panel.background = element_blank(),axis.text = element_text(size = 8, color = 'black'), text = element_text(size = 8),plot.title = element_text(hjust = 0.5))+ggtitle('T')+ ylim(0,500)
问题原因
ylim() 与 scale_y_continuous() 同时使用时,后者会覆盖前者的设置(scale函数优先级更高)。当启用trans="reverse"反转Y轴时,需在scale_y_continuous()内指定范围,而非单独使用ylim()。此外,反转Y轴后,范围的顺序需要颠倒(从大值到小值)。
解决方案
将Y轴范围设置整合到scale_y_continuous()中,同时调整范围顺序以适配反转效果:
ggplot(df, aes(x, y, fill=w)) + geom_bar(stat='identity') + facet_wrap(~z, scales="free_y", ncol = 1) + xlab('a') + ylab('b') + theme( panel.background = element_blank(), axis.text = element_text(size = 8, color = 'black'), text = element_text(size = 8), plot.title = element_text(hjust = 0.5) ) + ggtitle('T') + scale_y_continuous(trans = "reverse", limits = c(500, 0))
说明:
- 用
limits = c(500, 0)替代原ylim(0,500),适配反转后的Y轴方向 - 保留
trans="reverse"实现Y轴反转 - 若需分面Y轴保持自由范围(仅反转),可移除
limits参数,让ggplot自动适配数据范围
内容的提问来源于stack exchange,提问作者Ghai
相关产品推荐
相关产品推荐

