ほくそ笑む

R言語と統計解析について

ggplot2 で axes を消す方法

最近、次の本を読んで日本地図を描くのにハマっている。

ggplot2 でシンプルに日本地図を描くとこんな感じになる。

library(tidyverse)
library(sf)
library(NipponMap)

shp <- system.file("shapes/jpn.shp", package = "NipponMap")
pref <- read_sf(shp) %>% filter(name != "Okinawa")

ggplot(pref) + geom_sf()

このとき、デフォルトでは x軸と y軸に経度と緯度が表示される。

これ、いらなくないですか? しかもこれ (axes) を消すのはけっこう面倒なコードを書く必要がある。

ggplot(pref) + geom_sf() + 
  theme(axis.ticks = element_blank(),  # tickの線を消す
        axis.text = element_blank(),   # tickの数字を消す
        axis.title = element_blank(),  # 軸のラベルを消す
        axis.line = element_blank())   # 軸の線を消す

今回はこれ (axes) を消す方法をいろいろと調べてみたので紹介する。

1. シンプルなテクニック

axes を消すシンプルなテクニックがある。 guides(x = "none", y = "none") とする方法だ。

ggplot(cars) + 
  geom_point(aes(speed, dist)) + 
  guides(x = "none", y = "none")

しかし、これはなぜか geom_sf() で書いた地図ではうまくいかない。

# なぜかうまくいかない
ggplot(pref) + geom_sf() + 
  guides(x = "none", y = "none")

代わりに、coord_sf()label_axes を指定することで axes を消すことができる。

ggplot(pref) + geom_sf() + 
  coord_sf(label_axes = "-")

こういったシンプルなテクニックを知っていれば axes は容易に消すことができる。

ただし、この方法の問題点として、コードを読んだとき、ぱっと見なにをしているのか分かりにくいということがある。

2. ggeasy パッケージ

先日、yutannihilation さんの YouTube 配信を聞いていて知った ggeasy パッケージには、簡単に axes を消す関数が用意されている。

library(ggeasy)
ggplot(pref) + geom_sf() + 
  easy_remove_axes()

この関数はけっこう柔軟に axes の一部だけ消すことができる。

# tickの線だけ消す
ggplot(pref) + geom_sf() + 
  easy_remove_axes(what = "ticks")

# x軸の axes だけを消す
ggplot(pref) + geom_sf() + 
  easy_remove_axes(which = "x")

# x軸の tick の線と y軸の tick の数字だけを消す
ggplot(pref) + geom_sf() + 
  easy_remove_axes(which = "x", what = "ticks") +
  easy_remove_axes(which = "y", what = "text")

3. テーマを変える

上記の方法では柔軟に一部分だけ消すというようなことができた。

そんなことはできなくていいという人には、テーマ (theme) を変えて消すという方法もある。

ggplot(pref) + geom_sf() + 
  theme_void()

背景が真っ白になってしまったが、地図の場合はこれで困る人はいないだろう。

他にも cowplot パッケージの theme_nothing() というのもある。

ggplot(pref) + geom_sf() + 
  cowplot::theme_nothing()

cowplot パッケージには地図用のテーマがあり、これを使っても消すことができる。

ggplot(pref) + geom_sf() + 
  cowplot::theme_map()

追記: ggforce パッケージには theme_no_axes() という関数がある。

ggplot(pref) + geom_sf() + 
  ggforce::theme_no_axes(base.theme = theme_minimal())

参考