本文へスキップ
からだにいいもの

Rのトピックスを中心に『まだ、まだ、知らない、役に立つ情報?』を発信します。

Rで解析:ggplot2の点や軸ラベルをアイコンに置き換えられる「ggicons」パッケージ

ggiconsパッケージは、ggplot2で作ったグラフの点や軸ラベルを、円や三角形などのアイコンに置き換えてプロットできます。渡すデータはggplot2と同じ形のデータフレームで、割合をアイコンの集合として示すワッフルチャートやレーティング表示も同じ枠組みで作れます。

本パッケージはggplot2の拡張として動作するため、凡例や軸ラベルにアイコンを取り入れて、数量や割合を直感的に示したい人には向いているのではないかと考えます。

パッケージバージョンは0.1.0。Windows 11 x64 (build 26200)のR version 4.6.1で確認しています。

パッケージのインストール

下記コマンドを実行してください。

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

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

# コマンド例実行で必要なパッケージを読み込み
library("ggplot2")
スポンサーリンク

コマンド例

詳細はコメント、パッケージのヘルプを確認してください。

ggiconsパッケージでは、iconsパッケージが提供するアイコンオブジェクトを、ggplot2のicon美的属性やアイコン専用のコマンドに渡してプロットします。パッケージには見本用に丸・四角・三角・星の4種類のアイコンが同梱されています。

アイコンを点としてプロットする:geom_iconコマンド

geom_point()の点を、指定したアイコンに置き換えてプロットするコマンドです。

オプション意味初期値
mappingアイコンを指定する美的属性を含む ggplot2::aes() オブジェクトNULL
dataこのレイヤーでプロットするデータ、NULLではプロット全体のデータを継承し、データフレームやコマンドを渡すと上書きできるNULL
statデータに適用する統計変換、”identity”は変換しない“identity”
positionデータに適用する位置調整、”identity”は位置調整しない“identity”
colourやalphaなどレイヤー全体へ固定値として適用する美的属性を渡す、key_glyphも指定できるなし
size.unitsize美的属性を解釈する単位、”mm”(既定)、”pt”、”cm”、”in”などを指定できる“mm”
na.rmFALSEでは欠損値を警告付きで除去し、TRUEでは警告なしで除去するFALSE
show.legendこのレイヤーを凡例に含めるかどうか、NAでは美的属性がマッピングされている場合のみ含めるNA
inherit.aesFALSEではggplot2::ggplot()で指定した既定の美的属性を継承せず上書きするTRUE
# アイコンの形を読み込む(丸・四角・三角・星の4種類)
shapes <- icons::icon_set(system.file("icons", package = "ggicons"))

# 宇治市内3つの茶園の収穫量と、茶園ごとに割り当てるアイコンを用意する
chaen <- data.frame(
  chaen = c("白川茶園", "田原茶園", "炭山茶園"),
  shukakuryo = c(180, 240, 150),
  icon = c(shapes$circle, shapes$square, shapes$triangle)
)

# 収穫量をy軸にとり、茶園ごとに異なるアイコンをプロットする
ggplot(chaen, aes(x = chaen, y = shukakuryo, icon = icon)) +
  geom_icon(size = 10, colour = "#2e7d32")

収穫量をy軸にとり、茶園ごとに異なるアイコンをプロットする

指定した位置にアイコンを1つ添える:annotation_iconコマンド

散布図などの指定した座標に、アイコンを1つだけ添えるコマンドです。

オプション意味初期値
iconプロットするアイコンベクトル(iconsパッケージが提供する形式)、文字列のIDはそのままでは解釈されないため実際のアイコンベクトルを渡すなし
xアイコンを配置する位置(データ座標のx)なし
yアイコンを配置する位置(データ座標のy)なし
colourアイコンの色、fillも指定されている場合はfillが優先される“black”
fillアイコンの塗り色、colourより優先されるNA
sizeアイコンの大きさ(幅・高さ)、size.unitで指定した単位で表す6
alpha透明度、0(完全に透明)から1(不透明)までNA
angle回転角度(度)0
size.unitsizeを解釈する単位、”mm”(既定)、”pt”、”cm”、”in”などを指定できる“mm”
# アイコンの形を読み込む
shapes <- icons::icon_set(system.file("icons", package = "ggicons"))

# 京都市内のある観光地点における、月別の来訪者数(万人)を作成する
raihou <- data.frame(
  tsuki = 1:12,
  ninzu = c(28, 25, 30, 42, 38, 33, 45, 40, 36, 44, 39, 47)
)

# 散布図に、祇園祭の時期(7月)を示す星のアイコンを添える
ggplot(raihou, aes(x = tsuki, y = ninzu)) +
  geom_point(colour = "#2e7d32", size = 3) +
  annotation_icon(icon = shapes$star, x = 7, y = 45, size = 14, colour = "#c9a227") +
  labs(x = "月", y = "来訪者数(万人)")

散布図に、祇園祭の時期(7月)を示す星のアイコンを添える

凡例のキーをアイコンに置き換える:draw_key_iconコマンド

geom_point()などのkey_glyphオプションに渡し、凡例のキーをアイコンに置き換えるコマンドです。

オプション意味初期値
dataこの凡例キーに表示するスケール済みの美的属性を含む、1行のデータフレームなし
paramsgeomに渡された追加パラメータのリストなし
size凡例キーの幅・高さ(mm)なし
# アイコンの形を読み込む
shapes <- icons::icon_set(system.file("icons", package = "ggicons"))

# 宇治茶の産地別に、収穫量と単価をまとめる
chatsu <- data.frame(
  shukakuryo = c(180, 240, 150),
  tanka = c(1200, 980, 1350),
  sanchi = c("宇治", "和束", "南山城")
)

# 産地ごとに色分けし、凡例のキーをアイコンに置き換える
ggplot(chatsu, aes(x = shukakuryo, y = tanka, colour = sanchi, icon = sanchi)) +
  geom_point(size = 10, key_glyph = draw_key_icon) +
  scale_icon_manual(values = c(shapes$circle, shapes$square, shapes$triangle)) +
  labs(x = "収穫量(kg)", y = "単価(円/kg)", colour = "産地")

産地ごとに色分けし、凡例のキーをアイコンに置き換える

軸ラベルをアイコンに置き換える:element_iconコマンド

軸のテキストラベルを、カテゴリに対応するアイコンに置き換えるテーマ要素です。

オプション意味初期値
iconsアイコンオブジェクトを格納した名前付きリスト、NULL(既定)ではアイコンへの置き換えを行わないNULL
ggplot2::element_text()へ渡すその他のオプションなし
sizeテキストのポイントサイズ、アイコンでは幅・高さのポイント数になるNULL
colourテキストの色、アイコンでは塗り色になるNULL
inherit.blankggplot2::element_text()を参照FALSE
# アイコンの形を読み込む
shapes <- icons::icon_set(system.file("icons", package = "ggicons"))

# 抹茶体験の等級別に、満足度アンケートの回答を作成する
manzoku <- data.frame(
  tokyu = factor(rep(c("普通", "上級", "特上"), each = 6),
    levels = c("普通", "上級", "特上")
  ),
  ten = c(
    3, 4, 3, 4, 5, 4,
    4, 5, 4, 5, 5, 4,
    5, 5, 5, 4, 5, 5
  )
)

# 等級ごとに割り当てるアイコンを用意する
tokyu_icon <- list(
  "普通" = shapes$circle,
  "上級" = shapes$square,
  "特上" = shapes$star
)

# 箱ひげ図の横軸ラベルをアイコンに置き換える
ggplot(manzoku, aes(x = tokyu, y = ten)) +
  geom_boxplot() +
  theme(axis.text.x = element_icon(icons = tokyu_icon, size = 14))

箱ひげ図の横軸ラベルをアイコンに置き換える

割合をアイコンの集合でプロットする:geom_pictogramコマンド

数値をアイコンの集合として並べ、ワッフルチャートやレーティング表示のようなピクトグラムをプロットするコマンドです。

オプション意味初期値
mappingピクトグラムを指定する美的属性を含む ggplot2::aes() オブジェクトNULL
dataこのレイヤーでプロットするデータ、NULLではプロット全体のデータを継承し、データフレームやコマンドを渡すと上書きできるNULL
statデータに適用する統計変換、既定の”pictogram”はstat_pictogram()を使う“pictogram”
positionデータに適用する位置調整、”identity”は位置調整しない“identity”
colourやalphaなどレイヤー全体へ固定値として適用する美的属性を渡す、key_glyphも指定できるなし
nグリッド全体のマス数(固定グリッドモード)、NULL(既定)ではvalueに合わせてグリッドを広げるNULL
nrowグリッドの行数、nrowとncolはどちらか一方だけ指定し、もう一方はマス数から自動的に決まる。両方NULLでは1行(または1列)に折り返すNULL
ncolグリッドの列数、指定の仕方はnrowと同じNULL
symbol_value1マスが表すデータの値、NULL(既定)では自動的に決まる。固定グリッドモードでは1、可変グリッドモードでは最大値がn_target個程度のアイコン数に収まる数値を選ぶNULL
n_target可変グリッドモードでsymbol_valueを自動決定する際、レイヤーの最大値をおよそ何個のアイコンで表すかの目安。symbol_valueを明示した場合や固定グリッドモードでは無視される20
flowマスを埋める順序、”row”(既定)は左から右へ埋めて次の行へ折り返し、”col”は上から下へ埋めて次の列へ折り返す“row”
size.unitsizeを解釈する単位、geom_icon()と同様に”mm”(既定)、”pt”、”cm”、”in”などを指定できる“mm”
spacing隣り合うアイコンの間隔、sizeに対する比率0.2
hjustグリッドを(x, y)に対してどこに置くかを幅に対する比率で指定、0.5で中央、0/1で端に揃える。既定のNULLではstat_pictogram()の向きに従うNULL
vjustグリッドを(x, y)に対してどこに置くかを高さに対する比率で指定、指定の仕方はhjustと同じNULL
empty.colour空のマスの色“grey85”
empty.alpha空のマスの透明度、既定ではalpha美的属性の値になるNULL
na.rmFALSEでは欠損値を警告付きで除去し、TRUEでは警告なしで除去するFALSE
show.legendこのレイヤーを凡例に含めるかどうか、NAでは美的属性がマッピングされている場合のみ含めるNA
inherit.aesFALSEではggplot2::ggplot()で指定した既定の美的属性を継承せず上書きするTRUE
# アイコンの形を読み込む
shapes <- icons::icon_set(system.file("icons", package = "ggicons"))

# 宇治茶の市場シェア(37%)を10×10のワッフルチャートでプロットする
ggplot(NULL, aes(x = "宇治茶のシェア", value = 37)) +
  geom_pictogram(icon = shapes$square, n = 100, nrow = 10) +
  labs(value = "%")

# 抹茶体験の満足度(5点満点中4点)を星5個の評価チャートでプロットする
ggplot(NULL, aes(y = "満足度", value = 4)) +
  geom_pictogram(icon = shapes$star, n = 5, colour = "#c9a227") +
  guides(value = "none")

宇治茶の市場シェア(37%)を10×10のワッフルチャートでプロットする

抹茶体験の満足度(5点満点中4点)を星5個の評価チャートでプロットする

ピクトグラムの集計を直接指定する:stat_pictogramコマンド

geom_pictogram()の集計処理を、レイヤーの統計変換として直接呼び出すコマンドです。

オプション意味初期値
mappingピクトグラムを指定する美的属性を含む ggplot2::aes() オブジェクトNULL
dataこのレイヤーでプロットするデータ、NULLではプロット全体のデータを継承し、データフレームやコマンドを渡すと上書きできるNULL
geomstat_pictogram()とgeom_pictogram()の既定の対応関係を上書きする“pictogram”
positionデータに適用する位置調整、”identity”は位置調整しない“identity”
colourやalphaなどレイヤー全体へ固定値として適用する美的属性を渡すなし
nグリッド全体のマス数(固定グリッドモード)、NULL(既定)ではvalueに合わせてグリッドを広げるNULL
nrowグリッドの行数、nrowとncolはどちらか一方だけ指定し、もう一方はマス数から自動的に決まる。両方NULLでは1行(または1列)に折り返すNULL
ncolグリッドの列数、指定の仕方はnrowと同じNULL
symbol_value1マスが表すデータの値、NULL(既定)では自動的に決まる。固定グリッドモードでは1、可変グリッドモードでは最大値がn_target個程度のアイコン数に収まる数値を選ぶNULL
n_target可変グリッドモードでsymbol_valueを自動決定する際、レイヤーの最大値をおよそ何個のアイコンで表すかの目安。symbol_valueを明示した場合や固定グリッドモードでは無視される20
flowマスを埋める順序、”row”(既定)は左から右へ埋めて次の行へ折り返し、”col”は上から下へ埋めて次の列へ折り返す“row”
na.rmFALSEでは欠損値を警告付きで除去し、TRUEでは警告なしで除去するFALSE
show.legendこのレイヤーを凡例に含めるかどうか、NAでは美的属性がマッピングされている場合のみ含めるNA
inherit.aesFALSEではggplot2::ggplot()で指定した既定の美的属性を継承せず上書きするTRUE
# アイコンの形を読み込む
shapes <- icons::icon_set(system.file("icons", package = "ggicons"))

# geom_pictogram()と同じ結果を、stat_pictogram()から直接指定する
ggplot(NULL, aes(x = "宇治茶のシェア", value = 37)) +
  stat_pictogram(geom = "pictogram", icon = shapes$square, n = 100, nrow = 10)

geom_pictogram()と同じ結果を、stat_pictogram()から直接指定する

ピクトグラムの凡例を調整する:guide_pictogramコマンド

geom_pictogram()の凡例、つまりアイコン1個が表す値の見本を調整するガイドです。

オプション意味初期値
title凡例のタイトル、既定ではvalueスケールの名前(通常labs(value = …)で設定したもの)になるggplot2::waiver()
symbol_value表示する比率を対応するレイヤーから読み取る代わりに上書きする、通常は指定不要NULL
label凡例キーのラベル文字列を、既定の”= {symbol_value}”の代わりに丸ごと上書きするNULL
icon凡例キーに描くアイコン。対応するレイヤーのicon美的属性がマッピングされている場合にのみ指定が必要で、カテゴリごとにアイコンが異なる場合は自動的に決まらず単色の見本になるため、明示的に指定するNULL
themeこの凡例だけをプロット全体のテーマ設定と異なるスタイルにするためのthemeオブジェクトNULL
position凡例をパネルに対してどこに置くか、”top”、”right”、”bottom”、”left”、”inside”のいずれかNULL
direction凡例の向き、”horizontal”または”vertical”NULL
override.aes凡例キーの美的属性を指定するリストlist()
order複数の凡例を並べる順序を指定する99未満の正の整数、0(既定)では自動的に決まる0
無視されるなし
# アイコンの形を読み込む
shapes <- icons::icon_set(system.file("icons", package = "ggicons"))

# 宇治と和束、2つの産地の年間出荷量(10kg単位)をまとめる
shukka <- data.frame(
  sanchi = c("宇治", "和束"),
  ryo = c(23, 15)
)

# 産地ごとにアイコンを変え、凡例のアイコンと見本の値を指定する
ggplot(shukka, aes(x = sanchi, value = ryo, icon = sanchi, colour = sanchi)) +
  geom_pictogram(nrow = 5) +
  scale_icon_manual(values = c(shapes$circle, shapes$square)) +
  guides(value = guide_pictogram(icon = shapes$circle, title = "出荷量(1個=10kg)")) +
  labs(colour = "産地")

産地ごとにアイコンを変え、凡例のアイコンと見本の値を指定する

アイコン1個あたりの値を調整する:scale_value_continuousコマンド

geom_pictogram()のvalue美的属性が使うスケールを調整し、凡例のタイトルやガイドを差し替えるコマンドです。

オプション意味初期値
nameスケールの名前、軸や凡例のタイトルに使う。waiver()(既定)ではそのオプションで最初に使われたマッピングから名前を取り、NULLでは凡例タイトルを表示しないggplot2::waiver()
breaks目盛りの位置、NULLで目盛りなし、waiver()(既定)で変換オブジェクトが計算する既定の目盛り、数値ベクトルやコマンドでも指定できるggplot2::waiver()
labels目盛りのラベル、指定できる形はbreaksとほぼ同様。ベクトルで指定する場合はbreaksもベクトルで指定した方がずれを防げるggplot2::waiver()
limitsスケールの範囲、NULL(既定)で自動、2要素の数値ベクトルで上下限を指定できる(NAで既存の最小・最大値を使う)NULL
guidevalueの凡例に使うガイド、既定の”pictogram”はguide_pictogram()を使う。”none”にする(またはgeom_pictogram()にshow.legend = FALSEを渡す)と凡例を消せる“pictogram”
continuous_scale()へ渡すその他のオプション(minor_breaks、oob、na.valueなど)なし
# アイコンの形を読み込む
shapes <- icons::icon_set(system.file("icons", package = "ggicons"))

# 宇治茶の市場シェアをワッフルチャートでプロットし、凡例の名前を単位付きに変える
ggplot(NULL, aes(x = "宇治茶のシェア", value = 37)) +
  geom_pictogram(icon = shapes$square, n = 100, nrow = 10) +
  scale_value_continuous(name = "割合(%)")

宇治茶の市場シェアをワッフルチャートでプロットし、凡例の名前を単位付きに変える


この記事が誰かの役に立ちますように。

スポンサーリンク
価格および配送状況は変更される場合があります。購入時は商品ページをご確認ください。
当サイトに表示されている商品情報はAmazonから提供されたものであり、更新または削除される場合があります。
karada-goodはAmazonアソシエイトとして、適格販売により収入を得ています。