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

如何在ggplot分面中设置各分面的独立刻度范围?

解决方案

要让每个分面使用独立的y轴刻度范围,只需对原代码做两处关键修改:

  1. 移除强制全局y轴范围的scale_y_continuous(limits=c(-32,32), ...)设置,避免限制所有分面的刻度区间。
  2. 在facet_grid中添加scales="free_y"参数,让每个分面的y轴自动适配对应数据的范围。

修改后的完整代码如下:

set.seed(199)
MB_RMSE_sd1 <-  runif(12, min = 0, max = 2)
set.seed(991)
TMB_RMSE_sd1 <- runif(12, min = 0, max = 2)

set.seed(199)
MB_RMSE_sd3 <-  runif(12, min = 2, max = 5)
set.seed(991)
TMB_RMSE_sd3 <- runif(12, min = 2, max = 5)

set.seed(199)
MB_RMSE_sd5 <- runif(12, min = 5, max = 10)
set.seed(991)
TMB_RMSE_sd5 <- runif(12, min = 5, max = 10)

set.seed(199)
MB_RMSE_sd10 <-  runif(12, min = 7, max = 16)
set.seed(991)
TMB_RMSE_sd10 <- runif(12, min = 7, max = 16)

set.seed(199)
MB_MAE_sd1 <-  runif(12, min = 0, max = 2)
set.seed(991)
TMB_MAE_sd1 <- runif(12, min = 0, max = 2)

set.seed(199)
MB_MAE_sd3 <-  runif(12, min = 2, max = 5)
set.seed(991)
TMB_MAE_sd3 <- runif(12, min = 2, max = 5)

set.seed(199)
MB_MAE_sd5 <- runif(12, min = 5, max = 10)
set.seed(991)
TMB_MAE_sd5 <- runif(12, min = 5, max = 10)

set.seed(199)
MB_MAE_sd10 <-  runif(12, min = 7, max = 16)
set.seed(991)
TMB_MAE_sd10 <- runif(12, min = 7, max = 16)

ID <- rep(rep(c("N10_AR0.8", "N10_AR0.9", "N10_AR0.95", "N15_AR0.8", "N15_AR0.9", "N15_AR0.95", "N20_AR0.8", "N20_AR0.9", "N20_AR0.95", "N25_AR0.8", "N25_AR0.9", "N25_AR0.95"), 2), 1)
df1 <- data.frame(ID, MB_RMSE_sd1, TMB_MAE_sd1, MB_RMSE_sd3, TMB_MAE_sd3, MB_RMSE_sd5, TMB_MAE_sd5, MB_RMSE_sd10, TMB_MAE_sd10)
reshapp1 <- reshape2::melt(df1, id = "ID")

NEWDAT <- data.frame(value = reshapp1$value, year = reshapp1$ID, Colour = rep(rep(c("RMSE_MB", "RMSE_TMB", "MAE_MB", "MAE_TMB"), each = 12), 4), sd = rep(rep(c(1, 3, 5, 10), each = 48), 1))

NEWDAT$sd <- with(NEWDAT, factor(sd, level = sd, labels = paste("sd =", sd)))
NEWDAT$year = factor(NEWDAT$year, levels=NEWDAT$year[1:12])

ggplot() +
  geom_bar(data=NEWDAT[NEWDAT$Colour %in% c("RMSE_MB", "RMSE_TMB"),], 
           aes(x=year, y=value, fill=rev(Colour)), stat="identity") +
  geom_bar(data=NEWDAT[NEWDAT$Colour %in% c("MAE_MB", "MAE_TMB"),], 
           aes(x=year, y=-value, fill=Colour), stat="identity") +
  geom_hline(yintercept=0, colour="grey40") +
  # 添加scales="free_y"实现分面独立y轴
  facet_grid(sd ~ ., scales="free_y") +
  scale_fill_manual(breaks=c("MAE_MB", "MAE_TMB", "RMSE_MB", "RMSE_TMB"),
                    values=c("red","blue","orange","green")) +
  # 保留原标签格式,同时根据分面数据自动生成刻度
  scale_y_continuous(breaks=function(x) seq(floor(x[1]), ceiling(x[2]), by=ifelse(diff(range(x))<5,1,5)),
                     labels=function(x) abs(x)) +
  guides(fill=guide_legend(reverse=TRUE)) +
  labs(fill="") + theme_bw() +
  theme(axis.text.x=element_text(angle=-90, vjust=0.5)) 

关键说明

  • scales="free_y":让每个分面的y轴根据自身数据的极值自动调整范围,sd=1和sd=3的分面就能清晰展示数据细节。
  • 调整后的scale_y_continuous:保留了原代码将负y值显示为正数的逻辑,同时根据分面数据范围自动选择刻度步长,保证不同区间的刻度可读性。

内容的提问来源于stack exchange,提问作者Daniel James

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:48:06