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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 18:42:39