Rのggplot2の xlim, ylim と coord_cartesian の違い

ggplot2の xlim, ylim と coord_cartesian の違いはこちらになります。

xlim, ylim と coord_cartesian の違い

範囲外のデータに対する処理

xlim, ylimは範囲外の値をNA(欠損)にします。
一方、coord_cartesianは範囲外の値に対し何の処理もしません(ズームインするだけ)。

library(ggplot2)
library(patchwork)

p <- ggplot(mtcars, aes(disp, wt)) +
    geom_point() +
    stat_smooth(method = "lm", col = "red", se = FALSE, formula = y~x-1) +
    scale_x_continuous(limits = c(0, 500)) +
    scale_y_continuous(limits = c(0, 6)) +
    labs(title = "original")
p1 <- p + xlim(c(0, 250)) + labs(title = "xlim(c(0, 250))")
p2 <- p + coord_cartesian(xlim = c(0, 250)) + labs(title = "coord_cartesian(xlim = c(0, 250))")
p / (p1 | plot_spacer()) / (p2 | plot_spacer())

xlim, ylimでは、範囲外の値は存在しないことになります。
そのため、originalとは異なる回帰直線になってしまいます(中段のグラフ)。

元の図(上段)・xlimで範囲指定した図(中段)・coord_cartesianで範囲指定した図(下段)

描画範囲(full range of the plot)

ここでの「描画範囲」は、stat_smooth関数(ggplot2)のヘルプに記載されている”full range of the plot“を指すものとします。

fullrange
       Should the fit span the full range of the plot, or just the data?

出典:stat_smooth関数のヘルプ

stat_smooth関数のヘルプは

?stat_smooth

で確認できます。

xlim, ylimの描画範囲は、指定された軸の範囲になります。
一方、coord_cartesianでは、データが存在する範囲になります。

p <- ggplot(mtcars, aes(disp, wt)) +
    geom_point() +
    stat_smooth(method = "lm", col = "red", se = FALSE, formula = y~x-1, fullrange = TRUE)
p3 <- p + xlim(c(0, 600)) + ylim(c(0, 8)) + labs(title = "xlim(c(0, 600)) + ylim(c(0, 8))")
p4 <- p + coord_cartesian(xlim = c(0, 600), ylim = c(0, 8)) + labs(title = "coord_cartesian(xlim = c(0, 600), ylim = c(0, 8))")
p3 / p4

stat_smooth関数のfullrange引数の値がTRUE なので、回帰直線の範囲は描画範囲全てになります。
ズームアウトしているとき、回帰直線をグラフ全体に描こうとすると、xlim, ylimを用いる必要があります(上段のグラフ)。

xlim, ylimで範囲指定した図(上段)・coord_cartesianで範囲指定した図(下段)

おわりに

今回の記事を書くきっかけは、stat_smoothでfull_range=TRUEが効かない問題に遭遇したからです(xlimを追加することで解決しました)。
今回の記事が参考になれば幸いです。

この記事が気に入ったらサポートをしてみませんか?