ggplotのY軸を一部省略

Rの関数 scale_x_break {ggbreak}(https://cran.r-project.org/package=ggbreak) を利用して ggplot で作成したチャートの Y軸 を一部省略(切断)する方法です。

時折り「棒グラフのY軸がゼロから始まっていない」と気色ばむ方がいらっしゃいますが、それは表示するデータの特性とチャートの目的次第です。

例えば、為替レートのように0.001円の単位で利益を得たり、破産したりする世界では Figure 1 のようなチャートを見せられても何の意味もありません。

# 架空の為替レートをサンプルデータとして作成します。
library(dplyr)
set.seed(20250517)
n <- 50
y <- rnorm(n = n, mean = 145, sd = 0.1) %>% round(3)
x <- seq(from = as.Date("2020-1-1"), by = "+1 day", length.out = n)
(y_intercept_low <- min(y))
(y_intercept_high <- max(y))
[1] 144.756
[1] 145.232

可視化します。

library(ggplot2)
g0 <- ggplot(mapping = aes(x = x, y = y)) +
  geom_col() +
  scale_x_date(labels = function(x) format(x, "%y/%m/%d")) +
  theme_minimal() +
  theme(axis.title = element_blank()) +
  geom_hline(yintercept = y_intercept_low, linetype = "dashed") +
  geom_hline(yintercept = y_intercept_high, linetype = "dashed")
g0
Figure 1

レートの動きがわかりません。

よって、関数 ggplot2::coord_cartesian を利用して「無駄」な範囲を非表示にしてしまいます。

g0 + coord_cartesian(ylim = c(min(y), max(y)))
Figure 2

しかし、どうしても「ゼロから始まる棒グラフ」に固執する方のために 関数 ggbreak::scale_y_break を利用して、Y軸の一部を省略します。

(break_position <- c(10, y %>% min() %>%
  {
    floor(. * 10^2) / 10^2
  }))
g1 <- g0 + ggbreak::scale_y_break(breaks = break_position, scales = 20)
g1
[1]  10.00 144.75
Figure 3

時系列データの変動が見やすくなりました。

体裁を整えます。

g2 <- g1 + scale_y_continuous(breaks = c(0, 10, scales::cbreaks(c(break_position[2], y %>% max() %>% ceiling()), scales::pretty_breaks(10))$breaks))
g2
Figure 4

さらに、右側のY軸テキストやティックが不要な場合は、

g2 +
  theme(
    axis.text.y.right = element_blank(),
    axis.ticks.y.right = element_blank(),
    axis.line.y.right = element_blank()
  )
Figure 5

以上です。