如何用ggplot绘制Y轴刻度一致但数据不同的两幅图?
问题描述
我想要绘制展示两年同一指标差异的图表,为便于对比,希望两幅图的Y轴保持相同的刻度间隔,但两年数据差异较大,ggplot会自动调整轴范围,请问如何避免这种情况?
当前问题如图所示,我希望两个Y轴都能延伸至300,因为后续还要和数据范围高于2021年的2022年数据对比。
用户现有代码
# Plot for 2020 defplot20 <- ggplot(def20, aes(x=date, y=neerslagtekort)) + geom_line() + theme_classic() + theme(axis.text.x = element_text(angle = 90)) + scale_x_date(date_breaks = "1 week", date_minor_breaks = "1 week", date_labels = "%d-%b", expand = c(0, 0)) + labs(y="Y", x="X") + ggtitle("2020") + scale_y_continuous(breaks = seq(0, 350, by = 25)) # Plot for 2021 defplot21 <- ggplot(def21, aes(x=date, y=neerslagtekort)) + geom_line() + theme_classic() + theme(axis.text.x = element_text(angle = 90)) + scale_x_date(date_breaks = "1 week", date_minor_breaks = "1 week", date_labels = "%d-%b", expand = c(0, 0)) + labs(y="Y", x="X") + ggtitle("2021") + scale_y_continuous(breaks = seq(0, 350, by = 25)) ggarrange(defplot20, defplot21)
解决方案
要强制所有图表使用相同的Y轴范围,只需在scale_y_continuous()中添加limits参数,明确指定Y轴的最小值和最大值。这样不管单年数据的范围如何,Y轴都会固定在设定区间内,保证刻度间隔一致。
修改后的代码
# Plot for 2020 defplot20 <- ggplot(def20, aes(x=date, y=neerslagtekort)) + geom_line() + theme_classic() + theme(axis.text.x = element_text(angle = 90)) + scale_x_date(date_breaks = "1 week", date_minor_breaks = "1 week", date_labels = "%d-%b", expand = c(0, 0)) + labs(y="Y", x="X") + ggtitle("2020") + scale_y_continuous(breaks = seq(0, 350, by = 25), limits = c(0, 350)) # 添加固定范围参数 # Plot for 2021 defplot21 <- ggplot(def21, aes(x=date, y=neerslagtekort)) + geom_line() + theme_classic() + theme(axis.text.x = element_text(angle = 90)) + scale_x_date(date_breaks = "1 week", date_minor_breaks = "1 week", date_labels = "%d-%b", expand = c(0, 0)) + labs(y="Y", x="X") + ggtitle("2021") + scale_y_continuous(breaks = seq(0, 350, by = 25), limits = c(0, 350)) # 添加固定范围参数 ggarrange(defplot20, defplot21)
优化写法(避免重复代码)
如果后续需要频繁调整Y轴范围,可以把Y轴配置抽成变量,只需修改一处即可同步所有图表:
# 定义统一的Y轴配置 y_axis_config <- scale_y_continuous( breaks = seq(0, 350, by = 25), limits = c(0, 350) ) # Plot for 2020 defplot20 <- ggplot(def20, aes(x=date, y=neerslagtekort)) + geom_line() + theme_classic() + theme(axis.text.x = element_text(angle = 90)) + scale_x_date(date_breaks = "1 week", date_minor_breaks = "1 week", date_labels = "%d-%b", expand = c(0, 0)) + labs(y="Y", x="X") + ggtitle("2020") + y_axis_config # Plot for 2021 defplot21 <- ggplot(def21, aes(x=date, y=neerslagtekort)) + geom_line() + theme_classic() + theme(axis.text.x = element_text(angle = 90)) + scale_x_date(date_breaks = "1 week", date_minor_breaks = "1 week", date_labels = "%d-%b", expand = c(0, 0)) + labs(y="Y", x="X") + ggtitle("2021") + y_axis_config ggarrange(defplot20, defplot21)
后续适配2022年更高数据时,只需修改y_axis_config中的limits和breaks最大值即可。
内容的提问来源于stack exchange,提问作者Hartje
相关产品推荐
相关产品推荐

