Rで解析:アクセシブルな配色と統一されたテーマを適用できる「ekioplot」パッケージの紹介
「ekioplot」パッケージは、ggplot2で作成したグラフに統一感のある配色とテーマを適用できます。データフレームと列名を渡すだけで、棒グラフや散布図などの各コマンドが配色とフォントのそろった図を描きます。背景色に対して読みやすい文字色を選ぶコマンドも備えています。資料や報告書で複数の図の見た目をそろえたい人におすすめできるのではないかと考えます。
パッケージバージョンは1.1.0。Windows 11 x64 (build 26200)のR version 4.6.1で確認しています。
<おすすめのRに関する書籍です>
パッケージのインストール
下記コマンドを実行してください。
# パッケージのインストール
install.packages("ekioplot")
# パッケージの読み込み
library("ekioplot")コマンド例
ekioplotが提供するプロット用のコマンドは、いずれもデータフレームとX軸・Y軸に使う列名をそのまま渡す形式です。fillやcolorに離散変数を渡すと、paletteオプションで指定した配色が自動的に割り当てられます。連続変数を渡すとエラーになるため、あらかじめfactor()で囲むなどして離散変数に変換してください。
プロット用のコマンドとは別に、配色パレットを直接取得するekio_palコマンド、背景色に応じて読みやすい文字色を選ぶekio_text_onコマンド、既存のggplot2のグラフに統一したテーマを適用するtheme_ekioコマンドも用意されています。
以降の例では、京都府内5つの直売所を想定した架空の売上データを使います。
# 京都府内5直売所×12か月×4品目の組み合わせを作成
kyoto_ichiba <- expand.grid(
直売所 = c("嵐山", "亀岡", "舞鶴", "南丹", "伊根"),
月 = 1:12,
品目 = c("九条ねぎ", "賀茂なす", "万願寺とうがらし", "京たけのこ")
)
# 乱数の種を固定
set.seed(913)
# 月ごとに変動する来客数を生成
kyoto_ichiba$客数 <- round(80 + 40 * sin((kyoto_ichiba$月 - 3) / 12 * 2 * pi) + rnorm(nrow(kyoto_ichiba), sd = 10))
# 来客数に応じた販売額を生成
kyoto_ichiba$販売額 <- round(kyoto_ichiba$客数 * (300 + rnorm(nrow(kyoto_ichiba), sd = 40)))
# 月ごとに変動する平均気温を生成
kyoto_ichiba$気温 <- round(15 + 10 * sin((kyoto_ichiba$月 - 4) / 12 * 2 * pi) + rnorm(nrow(kyoto_ichiba), sd = 1.5), 1)背景色に適した文字色の選択:ekio_text_onコマンド
ekio_text_onコマンドは、指定した背景色に対して読みやすい文字色(darkまたはlightのいずれか)を選びます。背景色は複数まとめて渡すこともできます。
| オプション | 意味 | 初期値 |
|---|---|---|
| background | 文字色を判定する背景色。16進数カラーコードまたはRのカラー名(複数指定可) | なし |
| dark | 暗い文字色の候補 | “black” |
| light | 明るい文字色の候補 | “white” |
# 背景色(青の700番相当)に対して読みやすい文字色を判定
ekio_text_on(ekio_pal("blue")["700"])
700
"white"
# 青のパレット全体を背景色として渡し、それぞれに読みやすい文字色を判定
ekio_text_on(ekio_pal("blue"))
100 200 300 400 500 600 700 800 900
"black" "black" "black" "black" "white" "white" "white" "white" "white"
# フルカラーパレットを背景色として渡し、暗い文字色の候補を濃い灰色に指定
ekio_text_on(ekio_pal("full"), dark = ekio_pal("gray")["900"])
[1] "white" "#191A1C" "white" "#191A1C" "white" "white" "white"
[8] "#191A1C"積み上げ面積グラフの描画:ekio_areaplotコマンド
ekio_areaplotコマンドは、面グラフを描画します。fillに離散変数を渡すと品目ごとに色分けされ、positionを”fill”にすると構成比で積み上げられます。
| オプション | 意味 | 初期値 |
|---|---|---|
| data | 使用するデータフレーム | なし |
| x | X軸に使う変数 | なし |
| y | Y軸に使う変数 | なし |
| fill | 塗りつぶしに使う色、または離散変数。連続変数を渡すとエラーになるため、あらかじめbin化するかfactor()で囲む | NULL |
| palette | 変数を色にマッピングする際のパレット名 | NULL |
| position | 積み上げ方法。「stack」(既定)で通常の積み上げ、「fill」で構成比による積み上げ | “stack” |
| alpha | 塗りつぶしの透明度 | 1 |
| title | グラフタイトル。NULL(既定)では表示しない | NULL |
| subtitle | サブタイトル。NULL(既定)では表示しない | NULL |
| caption | キャプション。NULL(既定)では表示しない | NULL |
| … | ggplot2::geom_area()へ渡す追加オプション。テーマ側の既定値より優先される | なし |
# 亀岡の直売所データを抽出
kameoka <- subset(kyoto_ichiba, 直売所 == "亀岡")
# 月別の来客数を合計
kameoka_total <- aggregate(客数 ~ 月, data = kameoka, FUN = sum)
# 月別来客数の推移を面グラフで表示
ekio_areaplot(kameoka_total, 月, 客数)
# 品目別の月別販売額を積み上げ面グラフで表示
ekio_areaplot(kameoka, 月, 販売額, fill = 品目)月別来客数の推移を面グラフで表示

品目別の月別販売額を積み上げ面グラフで表示

棒グラフの描画:ekio_barplotコマンド
ekio_barplotコマンドは、棒グラフを描画します。horizontalをTRUEにすると横向きの棒グラフになります。
| オプション | 意味 | 初期値 |
|---|---|---|
| data | 使用するデータフレーム | なし |
| x | X軸に使う変数 | なし |
| y | Y軸に使う変数 | なし |
| fill | 塗りつぶしに使う色、または離散変数。連続変数を渡すとエラーになるため、あらかじめbin化するかfactor()で囲む | NULL |
| palette | 変数を色にマッピングする際のパレット名 | NULL |
| horizontal | 棒グラフを横向きにするかどうか | FALSE |
| bar_width | 棒の幅 | 0.8 |
| title | グラフタイトル。NULL(既定)では表示しない | NULL |
| subtitle | サブタイトル。NULL(既定)では表示しない | NULL |
| caption | キャプション。NULL(既定)では表示しない | NULL |
| … | ggplot2::geom_col()へ渡す追加オプション。テーマ側の既定値より優先される | なし |
# 品目別の年間販売額を集計
hinmoku_total <- aggregate(販売額 ~ 品目, data = kyoto_ichiba, FUN = sum)
# 品目別の年間販売額を棒グラフで表示
ekio_barplot(hinmoku_total, 品目, 販売額)品目別の年間販売額を棒グラフで表示

ヒストグラムの描画:ekio_histogramコマンド
ekio_histogramコマンドは、ヒストグラムを描画します。binsまたはbinwidthでビンの分け方を指定できます。
| オプション | 意味 | 初期値 |
|---|---|---|
| data | 使用するデータフレーム | なし |
| x | 対象の変数 | なし |
| fill | 塗りつぶしに使う色、または離散変数。NULLの場合はEKIOブルーを使う。連続変数を渡すとエラーになるため、あらかじめbin化するかfactor()で囲む | NULL |
| palette | 変数を色にマッピングする際のパレット名 | NULL |
| bins | ビンの分け方。「sturges」「FD」「scott」または数値 | “sturges” |
| binwidth | ビンの幅(指定するとbinsより優先される) | NULL |
| border_color | ヒストグラムの輪郭の色 | “white” |
| title | グラフタイトル。NULL(既定)では表示しない | NULL |
| subtitle | サブタイトル。NULL(既定)では表示しない | NULL |
| caption | キャプション。NULL(既定)では表示しない | NULL |
| … | ggplot2::geom_histogram()へ渡す追加オプション。テーマ側の既定値より優先される | なし |
# 客単価(販売額を客数で割った値)を算出
kyoto_ichiba$客単価 <- round(kyoto_ichiba$販売額 / kyoto_ichiba$客数)
# 客単価の分布をヒストグラムで表示
ekio_histogram(kyoto_ichiba, 客単価)
# 塗りつぶし色をsteelblueに指定してヒストグラムを表示
ekio_histogram(kyoto_ichiba, 客単価, fill = "steelblue")
# 直売所ごとに色分けしたヒストグラムを表示
ekio_histogram(kyoto_ichiba, 客単価, fill = 直売所, palette = "full")客単価の分布をヒストグラムで表示

塗りつぶし色をsteelblueに指定してヒストグラムを表示

直売所ごとに色分けしたヒストグラムを表示

<おすすめのRに関する書籍です>
折れ線グラフの描画:ekio_lineplotコマンド
ekio_lineplotコマンドは、折れ線グラフを描画します。add_zeroをTRUEにするとy=0の位置に水平線が加わります。
| オプション | 意味 | 初期値 |
|---|---|---|
| data | 使用するデータフレーム | なし |
| x | X軸に使う変数 | なし |
| y | Y軸に使う変数 | なし |
| color | 線の色、または離散変数。連続変数を渡すとエラーになるため、あらかじめbin化するかfactor()で囲む | NULL |
| palette | 変数を色にマッピングする際のパレット名 | NULL |
| add_zero | y=0の位置に水平線を加えるかどうか | FALSE |
| line_width | 線の太さ | 0.8 |
| title | グラフタイトル。NULL(既定)では表示しない | NULL |
| subtitle | サブタイトル。NULL(既定)では表示しない | NULL |
| caption | キャプション。NULL(既定)では表示しない | NULL |
| … | ggplot2::geom_line()へ渡す追加オプション。テーマ側の既定値より優先される | なし |
# 亀岡の月別平均気温を集計
kameoka_temp <- aggregate(気温 ~ 月, data = kameoka, FUN = mean)
# 月別平均気温の推移を折れ線グラフで表示
ekio_lineplot(kameoka_temp, 月, 気温)月別平均気温の推移を折れ線グラフで表示

配色パレットの取得:ekio_palコマンド
ekio_palコマンドは、指定したパレットの色を文字ベクトルとして取得します。取得する色数はn、順序の反転はreverseで指定します。
| オプション | 意味 | 初期値 |
|---|---|---|
| palette | パレット名 | “full” |
| n | 取得する色数。NULL(既定)では全色を返す。「accent_blue」「accent_orange」はNULLのとき4色を返す。連続・divergingパレットはn色を全域から補間し、2種類のアクセントパレットは2〜6色を指定できる。「gold」などのカテゴリカルパレットと科学系パレットは先頭からn色を取り、パレットの色数を超える場合のみ補間する | NULL |
| reverse | TRUEにするとパレットの順序を反転する | FALSE |
# フルカラーパレットを取得
ekio_pal("full")
# 4色に絞ったパレットを取得
ekio_pal("full", n = 4)
# パレットの順序を反転して取得
ekio_pal("full", reverse = TRUE)
# アクセントブルーの5色パレットを取得
ekio_pal("accent_blue", n = 5)
# okabe_itoパレットを取得
ekio_pal("okabe_ito")
# ブランドの配色は濃淡ごとに名前が付いており、位置iは濃淡i×100に対応する
# 特定の濃度の青色を取得
ekio_pal("blue")["700"]
700
"#1E3A5F"
# インデックスを指定して青色を取得
ekio_pal("blue")[7]
700
"#1E3A5F"
# goldは番号ではなく名前で色を指定するアクセントカラー
# 名前を指定してゴールドを取得
ekio_pal("gold")["mid"]
mid
"#B88715"フルカラーパレットを取得

4色に絞ったパレットを取得

パレットの順序を反転して取得

アクセントブルーの5色パレットを取得

okabe_itoパレットを取得

<おすすめのRに関する書籍です>
散布図の描画:ekio_scatterplotコマンド
ekio_scatterplotコマンドは、散布図を描画します。add_smoothをTRUEにすると回帰直線などの平滑化した傾向線を重ねられます。
| オプション | 意味 | 初期値 |
|---|---|---|
| data | 使用するデータフレーム | なし |
| x | X軸に使う変数 | なし |
| y | Y軸に使う変数 | なし |
| color | 点の色、または変数。連続変数を渡すと警告のうえ連続的な配色になる | NULL |
| size | 点の大きさに使う変数(省略可) | NULL |
| palette | 変数を色にマッピングする際のパレット名 | NULL |
| add_zero | y=0の位置に水平線を加えるかどうか | FALSE |
| add_smooth | 平滑化した傾向線を加えるかどうか | FALSE |
| smooth_method | 平滑化の方法。「lm」「gam」「loess」 | “lm” |
| point_size | 点の基本サイズ | 2.5 |
| point_alpha | 点の透明度 | 0.8 |
| title | グラフタイトル。NULL(既定)では表示しない | NULL |
| subtitle | サブタイトル。NULL(既定)では表示しない | NULL |
| caption | キャプション。NULL(既定)では表示しない | NULL |
| … | ggplot2::geom_point()へ渡す追加オプション。テーマ側の既定値より優先される | なし |
# 気温と来客数の関係を散布図で表示
ekio_scatterplot(kyoto_ichiba, 気温, 客数)
# 品目ごとに色分けした散布図を表示
ekio_scatterplot(kyoto_ichiba, 気温, 客数, color = 品目)気温と来客数の関係を散布図で表示

品目ごとに色分けした散布図を表示

グラフへのテーマの適用:theme_ekioコマンド
theme_ekioコマンドは、既存のggplot2のグラフに統一したテーマを適用します。font_titleとfont_textで、タイトルとそれ以外の文字要素のフォントを別々に指定できます。
| オプション | 意味 | 初期値 |
|---|---|---|
| base_size | 基準フォントサイズ | 11 |
| font_title | グラフタイトルにのみ適用するフォント | “Lora” |
| font_text | タイトル以外の文字要素に適用するフォント | “Lato” |
| title_align | ggplot2::theme()に渡すオプション。「plot」または「panel」 | “plot” |
| grid | 表示する主目盛線。「y」(既定)「x」「xy」「none」のいずれかで、指定した方向のみ描画する | “y” |
| ticks | 表示する軸目盛と軸線。「x」(既定)「y」「xy」「none」のいずれかで、gridとは独立して指定する | “x” |
| background | プロットとパネルの背景。「offwhite」(既定、#FEFEFE)「white」(#FFFFFF)「gray」(ブランドカラーのgray.100)「transparent」のいずれか | “offwhite” |
| … | ggplot2::theme_minimal()へ渡す追加オプション | なし |
# 気温と来客数の散布図にカスタムテーマを適用
ggplot2::ggplot(kyoto_ichiba, ggplot2::aes(気温, 客数)) +
ggplot2::geom_point() +
theme_ekio(font_title = "serif", font_text = "sans")気温と来客数の散布図にカスタムテーマを適用

<おすすめのRに関する書籍です>
この記事が誰かの役に立ちますように。