Rで解析:ggplot2で作成したプロットにラベルをいろいろ配置「directlabels」パッケージ

Rの解析に役に立つ記事
スポンサーリンク

directlabels」パッケージはggplot2やlatticeで作成したプロットの系列付近へ直接ラベルを配置することができます。折れ線グラフ・散布図・密度プロットなどは凡例が煩雑になりがちですが、系列付近へ直接ラベルを配置するので、視線移動が少ないグラフの作成が可能です。「ggplot2」パッケージでの利用例を紹介します。

パッケージバージョンは2025.5.20。実行コマンドはR version 4.5.0で確認しています。

目的:色分け系列が多い、折れ線グラフ・散布図・密度プロットの各指標にラベルを付与。


スポンサーリンク

インストールと読み込み、準備

下記、コマンドを実行してください。記事コマンドを実行するには「tidyverse」パッケージの読み込みが必要です。

# パッケージのインストール
install.packages("directlabels")

# パッケージの読み込み
library("directlabels")

# tidyverseパッケージの読み込み
# tidyverseパッケージがなければインストール
if(!require("tidyverse", quietly = TRUE)){
  install.packages("tidyverse");require("tidyverse")
}

主な機能と代表的なコマンド

他にコマンドがあるかもしれません。

区分関数/メソッド概要
ラベルの追加direct.label()既存 ggplot2 / lattice オブジェクトに直接ラベルを追加
geom_dl()ggplot2のコマンドに組み込むことが可能です、凡例を自動非表示します。「実行例」を参照ください。
ラベル位置の指定"last.points", "first.qp", "smart.grid" など系列に応じて自動配置します。位置の指定は「ラベル位置を指定するオプション」を参照ください。
組み合わせdl.combine()複数の位置を指定してラベルをプロット。例えば、先頭と末尾などにプロットします。

ラベル位置を操作するコマンド

他にコマンドがあるかもしれません。

コマンド主な役割位置指定に関わる
オプション
備考
direct.label(p, method, debug = FALSE)ggplot2のプロットに
ラベルを付与
method(後述のメソッドを指定)
debug(境界枠表示)
もっとも手軽に試せる入口関数
geom_dl(mapping,method, debug = FALSE)ggplot2 のレイヤーとしてラベルを追加
(ビルド時に凡例を自動非表示)
method, debugggplot2 のパイプラインに組み込みやすい
dl.combine(m1, m2)複数メソッドを合成し 1 つのメソッドを返すdl.combine("first.qp","last.qp") など
dl.trans(x = x + δx,
y = y + δy)
既存メソッドに平行移動を加えるヘルパーx, y(cm単位で指定)細かい微調整に便利

methodオプション共通で使える設定:list形式で位置と共に指定します。例:list(“last.points”, rot = 30)など

  • rot – 文字列の回転角度 (°)
  • cex – フォント倍率
  • hjust, vjust – 水平/垂直アンカー
  • alpha, fontface, family – 透過度・太字・フォント族
  • shift.x, shift.y – 全ラベルを一括シフト(dl.trans() と併用)

ラベル位置を指定するオプション

オプション名配置場所グラフ例
"first.qp"系列先頭折れ線グラフの左端
"last.qp"系列末尾折れ線グラフの右端
"first.points" / "last.points"先頭/末尾の実測点に添付点・線グラフ
"top.points" / "bottom.points"グループ内の最上/最下の点に配置散布図・折れ線
"smart.grid"点クラスタの重心付近に配置多群散布図
"extreme.grid"点群の外接四隅を探索して配置散布図
"angled.boxes"枠に収めつつ配置折れ線・面グラフ
"right.polygons" / "left.polygons"ポリゴンの右端/左端外側に配置面グラフ・等高線図

散布図の例

各グループの中央付近にラベルがプロットします。

# 図の作成
p <- ggplot(iris, aes(Petal.Length, Sepal.Length,
                      colour = Species)) +
  geom_point()

# 各グループ中央付近にラベルをプロット:direct.labelコマンド
direct.label(p = "smart.grid")  

折れ線グラフの例

各グループの線末端にラベルを重複を回避しプロットします。ラベルの大きさは自動調整です。

# 図の作成
library("nlme")
p2 <- ggplot(BodyWeight,
             aes(Time, weight, colour = Rat,
                 group = Rat)) +
  geom_line() +
  facet_grid(. ~ Diet)

# 末尾に重複回避で配置:ラベルの大きさは自動で調整
direct.label(p2, method = "last.qp")  

実行例

・正弦波と余弦波を描画し、 geom_dl() を使用して末尾に回転ラベルを配置した例

# 正弦波と余弦波を作成
df <- data.frame(
  x   = rep(seq(0, 2*pi, length.out = 200), 2),
  y   = c(sin(seq(0, 2*pi, length.out = 200)),
          cos(seq(0, 2*pi, length.out = 200))),
  grp = rep(c("sin", "cos"), each = 200)
)

# 「geom_dl」コマンドの使用例
ggplot(df, aes(x, y, colour = grp)) +
  geom_line() +
  geom_dl(aes(label = grp),
          method = list("last.points", rot = 30)) +
  theme_minimal()

・「dl.combine」コマンドを使用

系列の先頭と末尾に同時にラベルを付ける例です。「dl.combine」コマンドに “first.qp” と “last.qp” を指定し描写します。

# ── 1. データ例の作成 ───────────
set.seed(123)                               # 再現性確保
x_vals <- seq(0, 2*pi, length.out = 200)

df <- data.frame(
  x   = rep(x_vals, 3),
  y   = c(sin(x_vals),                # 系列 A
          cos(x_vals),                # 系列 B
          0.5 * sin(2 * x_vals)),     # 系列 C
  grp = factor(rep(c("sin", "cos", "0.5·sin(2x)"),
                   each = length(x_vals)))
)

# ── 2. 先頭+末尾ラベル用メソッドを作成 ───────────
first_last <- dl.combine("first.qp", "last.qp")

# ── 3. プロット ────────────────────────────────
ggplot(df, aes(x, y, colour = grp, group = grp)) +
  geom_line(linewidth = 0.7) +
  geom_dl(aes(label = grp),
          method = first_last) +
  theme_minimal() +
  labs(title = "dl.combine() で系列の両端にラベル",
       x = NULL, y = NULL, colour = NULL)

エラーと対処法

症状原因解決策
Error: no applicable positioning methodmethod を指定しておらず自動選択に失敗method"last.points"などの位置指定をする
ラベルが重なる系列数が多い/密集「dl.combine」コマンドで調整
ラベルが枠外へはみ出す文字サイズ大・余白不足methodにlistで「reduce.cex」を指定する。例:list("last.points",reduce.cex("lr"))。または clipオプションに"off"を設定

おわりに

directlabels を使えば煩雑な凡例付き図を凡例無しで直感的なラベル付与が可能です。 複数系列の比較を行うあらゆる可視化でぜひお試しください。


少しでも、あなたの解析が楽になりますように!!

タイトルとURLをコピーしました