Rのtmapパッケージで地図の上に縁取り文字を表示する方法

r
tmap 4.3からtm_textで文字の縁取りなどの装飾が実装されました
Published

2026-04-14

Modified

2026-04-14

Rのtmapパッケージで地図の上に縁取り文字を表示する方法を紹介します。 tmapパッケージのChangelogによると、バージョン4.3からtm_text関数で文字の縁取りなどの装飾が実装されたようです。

早速試してみました。

開発版のtmapのインストール

2026年4月14日時点では、まだtmapのCRAN版は4.3ではないため、開発版をインストールする必要があります。 renvを使っている場合は、以下のようにしてインストールできます。

renv::install("r-tmap/tmap")

その後、library()で読み込み、バージョンを確認します。

[1] '4.3'

縁取り文字の表示

アジアの国名を表示してみます。 まずは、縁取りなしの場合です。

Asia <- World[World$continent == "Africa", ]
tm_shape(Asia) +
  tm_polygons() +
  tm_text("name")

少し重なりが多いため、remove_overlap = TRUEを指定して、重なりをなくします。 表示されなくなってしまった国には申し訳ないですが、見やすくなります。

tm_shape(Asia) +
  tm_polygons() +
  tm_text("name", options = opt_tm_text(remove_overlap = TRUE))

これに、文字の縁取りをつけてみます。 opt_tm_textの引数で、halo = TRUEを指定します。

tm_shape(Asia) +
  tm_polygons() +
  tm_text("name", options = opt_tm_text(halo = TRUE, remove_overlap = TRUE))

白い縁取りがついて、塗りつぶしのある地図の上でも見やすくなりました。 オプションとしては、以下のようなものがあります。

  • halo: 縁取りを有効にするかどうかを指定します。デフォルトはFALSEです。
  • halo.col: 縁取りの色を指定します。デフォルトはNAです。
  • halo.width: 縁取りの幅を指定します。デフォルトは0.05です。
  • halo.blur: 縁取りのぼかし量を指定します。デフォルトは0です。
  • halo.alpha: 縁取りの透明度を指定します。デフォルトは0.8です。

たとえば、赤い縁取りをつけてみます。

tm_shape(Asia) +
  tm_polygons() +
  tm_text(
    "name",
    options = opt_tm_text(
      halo = TRUE,
      halo.col = "red",
      halo.width = 0.1,
      halo.blur = 0.05,
      halo.alpha = 0.9,
      remove_overlap = TRUE
    )
  )

Notehaloとは

haloは、文字の周りに線をつけることで、文字を地図の上で見やすくするためのオプションです。 ArcGISではそのまま「halo」と呼ばれていますが(参考)、QGISでは「buffer」と呼ばれています(参考)。

日本語だとなじみのない単語かもしれません。 日本語に訳すと「後光」や「光輪」といった意味になり、漢字ではと書くようです(参考)。 文字の周りに光が差しているようなイメージですね。

文字に影をつける

haloでは縁取りが付きましたが、shadowオプションを使うと、文字に影をつけることもできます。

tm_shape(Asia) +
  tm_polygons() +
  tm_text("name", options = opt_tm_text(shadow = TRUE, remove_overlap = TRUE))

少し違いが分かりにくいですが、文字の下に影がついて、地図の上でも見やすくなります。 shadowオプションの引数は以下の通りです。

  • shadow: 影を有効にするかどうかを指定します。デフォルトはFALSEです。
  • shadow.col: 影の色を指定します。デフォルトはNAです。
  • shadow.offset.x: 影の水平方向のオフセットを指定します。デフォルトは0.05です。
  • shadow.offset.y: 影の垂直方向のオフセットを指定します。デフォルトは0.05です。

影の効果をわかりやすくするために、少し大げさに影をつけてみます。

tm_shape(Asia) +
  tm_polygons() +
  tm_text(
    "name",
    options = opt_tm_text(
      shadow = TRUE,
      shadow.col = "orange",
      shadow.offset.x = 0.1,
      shadow.offset.y = 0.1,
      remove_overlap = TRUE
    )
  )

縁取りは文字の周りに線がつくのに対して、影は文字の下に別の文字が表示されるイメージです。 どちらも地図の上で文字を見やすくするためのオプションですが、好みや地図のデザインによって使い分けると良さそうです。

参考