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.unit | size美的属性を解釈する単位、”mm”(既定)、”pt”、”cm”、”in”などを指定できる | “mm” |
| na.rm | FALSEでは欠損値を警告付きで除去し、TRUEでは警告なしで除去する | FALSE |
| show.legend | このレイヤーを凡例に含めるかどうか、NAでは美的属性がマッピングされている場合のみ含める | NA |
| inherit.aes | FALSEでは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.unit | sizeを解釈する単位、”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行のデータフレーム | なし |
| params | geomに渡された追加パラメータのリスト | なし |
| 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.blank | ggplot2::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_value | 1マスが表すデータの値、NULL(既定)では自動的に決まる。固定グリッドモードでは1、可変グリッドモードでは最大値がn_target個程度のアイコン数に収まる数値を選ぶ | NULL |
| n_target | 可変グリッドモードでsymbol_valueを自動決定する際、レイヤーの最大値をおよそ何個のアイコンで表すかの目安。symbol_valueを明示した場合や固定グリッドモードでは無視される | 20 |
| flow | マスを埋める順序、”row”(既定)は左から右へ埋めて次の行へ折り返し、”col”は上から下へ埋めて次の列へ折り返す | “row” |
| size.unit | sizeを解釈する単位、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.rm | FALSEでは欠損値を警告付きで除去し、TRUEでは警告なしで除去する | FALSE |
| show.legend | このレイヤーを凡例に含めるかどうか、NAでは美的属性がマッピングされている場合のみ含める | NA |
| inherit.aes | FALSEでは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 |
| geom | stat_pictogram()とgeom_pictogram()の既定の対応関係を上書きする | “pictogram” |
| position | データに適用する位置調整、”identity”は位置調整しない | “identity” |
| … | colourやalphaなどレイヤー全体へ固定値として適用する美的属性を渡す | なし |
| n | グリッド全体のマス数(固定グリッドモード)、NULL(既定)ではvalueに合わせてグリッドを広げる | NULL |
| nrow | グリッドの行数、nrowとncolはどちらか一方だけ指定し、もう一方はマス数から自動的に決まる。両方NULLでは1行(または1列)に折り返す | NULL |
| ncol | グリッドの列数、指定の仕方はnrowと同じ | NULL |
| symbol_value | 1マスが表すデータの値、NULL(既定)では自動的に決まる。固定グリッドモードでは1、可変グリッドモードでは最大値がn_target個程度のアイコン数に収まる数値を選ぶ | NULL |
| n_target | 可変グリッドモードでsymbol_valueを自動決定する際、レイヤーの最大値をおよそ何個のアイコンで表すかの目安。symbol_valueを明示した場合や固定グリッドモードでは無視される | 20 |
| flow | マスを埋める順序、”row”(既定)は左から右へ埋めて次の行へ折り返し、”col”は上から下へ埋めて次の列へ折り返す | “row” |
| na.rm | FALSEでは欠損値を警告付きで除去し、TRUEでは警告なしで除去する | FALSE |
| show.legend | このレイヤーを凡例に含めるかどうか、NAでは美的属性がマッピングされている場合のみ含める | NA |
| inherit.aes | FALSEでは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()から直接指定する

<おすすめのRに関する書籍です>
ピクトグラムの凡例を調整する: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 |
| guide | valueの凡例に使うガイド、既定の”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 = "割合(%)")宇治茶の市場シェアをワッフルチャートでプロットし、凡例の名前を単位付きに変える

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