ggrepelパッケージで、ラベルの重なりを防ぐ

R
作者

伊東宏樹

公開

2026年2月18日

ggplot2のグラフにテキストを貼り込むとき、テキストが重なってしまうことがあります。ggrepelパッケージを使うとこれを防ぐことができます。

準備

ggplot2パッケージとggrepelパッケージを読み込みます。

library(ggplot2)
library(ggrepel)

set.seed(123)

データ

Rにデフォルトで入っているstateデータセットを使用します。このデータセットのなかのstate.x77にはアメリカ各州の人口・収入など8種類のデータが含まれています。

state.x77はmatrix型になっていますので、tibbleに変換します。州名はrownamesとして入っていて、データ本体には含まれていませんので、これをtibbleの新しい列として加えるようにしています。

data(state)

state <- tibble::as_tibble(state.x77) |>
  dplyr::mutate(State = rownames(state.x77))

実例

geom_textの場合

Areaを横軸に、Populationを縦軸にして散布図を描きます。両軸とも対数スケールにしています。

まずは、通常のgeom_textで州名を点の横に表示するようにします。

ggplot(state, aes(x = Area, y = Population)) +
  geom_point() +
  geom_text(aes(label = State), size = 2.25,
            hjust = 0, vjust = 0, nudge_x = 0,
            show.legend = FALSE) +
  scale_x_log10(breaks = 10^(3:6),
                minor_breaks = 5 * 10^(3:5)) +
  scale_y_log10(breaks = 10^(2:5),
                minor_breaks = 5 * 10^(2:4)) +
  theme_gray(base_family = "Helvetica", base_size = 12)

中央付近ではラベルが重なってしまいます。

geom_text_repelの場合

次に、geom_textのかわりにggrepelパッケージのgeom_text_repelを使います。引数のforceでラベル間の反発力を、segment.colourで線の色を、segment.sizeで線の太さをそれぞれ指定します。

ggplot(state, aes(x = Area, y = Population)) +
  geom_point() +
  geom_text_repel(aes(label = State), size = 2.25,
                  force = 2,
                  segment.colour = "gray30", segment.size = 0.5,  
                  show.legend = FALSE) +
  scale_x_log10(breaks = 10^(3:6),
                minor_breaks = 5 * 10^(3:5)) +
  scale_y_log10(breaks = 10^(2:5),
                minor_breaks = 5 * 10^(2:4)) +
  theme_gray(base_family = "Helvetica", base_size = 12)

ラベルが重ならなくなりました。

ただし、フォントサイズによっては全部のラベルを表示できない場合もありますので(警告が出ます)、そのあたりはsizeなどとのかねあいになります。