Rで解析:ggplot2の配色・テーマ・図形を拡張する「see」パッケージの紹介
「see」パッケージは、ggplot2で描いたグラフの配色やテーマ、点や分布の見せ方を整えるための拡張です。easystatsシリーズのモデル可視化に加えて、普段のggplot2のコードにそのまま重ねて使えます。図の体裁を手早くそろえたい人におすすめです。
パッケージバージョンは0.14.2。Windows 11 x64 (build 26200)のR version 4.6.1で確認しています。
<おすすめのRに関する書籍です>
パッケージのインストール
下記コマンドを実行してください。
# パッケージのインストール
install.packages("see")
# パッケージの読み込み
library("see")
# コマンド例実行で必要なパッケージを読み込み
library("ggplot2")コマンド例
詳細はコメント、パッケージのヘルプを確認してください。
seeのコマンドは大きく3系統に分かれます。scale_ で始まる配色スケール、theme_ で始まるテーマ、geom_ や coord_ で始まる図形と座標系です。いずれもggplot2の + でつなぐ記法に従うため、既存のグラフの末尾に足すだけで見た目が変わります。
配色スケールは、色覚の多様性に配慮したOkabe-Ito配色や、Material Designの色群など、あらかじめ用意された色の組を離散・連続の別に呼び出します。テーマは目盛や余白、凡例の位置をまとめて調整します。図形は、片側だけのバイオリンや、分布と点を重ねた表示など、ggplot2の標準にはない見せ方を追加します。
ここでは、京都府内の宇治茶の産地4か所(宇治市・和束町・南丹市・京丹後市)で採取した新芽のテアニン含有量と萎凋歩合、および主要3品種の官能評価点を模した擬似データを共通データとして使用します。
# 乱数シードの固定
set.seed(2026)
# 対象とする宇治茶の産地
産地 <- c("宇治市", "和束町", "南丹市", "京丹後市")
# 各産地の茶園から採取した新芽のテアニン含有量(mg/100g)と萎凋歩合(%)
茶葉 <- data.frame(
産地 = rep(産地, each = 45),
テアニン = round(c(rnorm(45, 1360, 130), rnorm(45, 1290, 110),
rnorm(45, 1180, 150), rnorm(45, 1230, 120))),
萎凋歩合 = round(c(rnorm(45, 12, 2.2), rnorm(45, 14, 2.0),
rnorm(45, 10, 1.8), rnorm(45, 11, 2.4)), 1))
# 産地ごとの平均値をまとめた集計表
産地平均 <- aggregate(cbind(テアニン, 萎凋歩合) ~ 産地, data = 茶葉, FUN = mean)
# 宇治茶の主要3品種を5つの観点で官能評価した点数(10点満点)
官能 <- data.frame(
評価項目 = rep(c("香り", "甘み", "渋み", "こく", "水色"), times = 3),
品種 = rep(c("さみどり", "ごこう", "おくみどり"), each = 5),
点数 = c(8.2, 7.4, 6.1, 7.9, 8.4,
7.1, 8.5, 5.3, 8.2, 7.5,
7.7, 6.9, 7.2, 6.8, 7.3))
<おすすめのRに関する書籍です>
[塗りつぶしをOkabe-Ito配色にする]:scale_fill_okabeitoコマンド
scale_fill_okabeitoは、Okabe-Ito配色を塗りつぶしの色に割り当てます。paletteで色の組を、orderで使用する色の順番を選び、reverseにTRUEを渡すと色の並びが逆になります。色相の差がはっきりしており、印刷や色覚の条件が異なる環境でも見分けやすい配色です。
| オプション | 意味 | 初期値 |
|---|---|---|
| palette | 使用するパレット名。離散スケールでは “full”、”ice”、”rainbow”、”complement”、”contrast”、”light”(暗いテーマ向け)、”black_first” などから選ぶ | “full” |
| reverse | パレットの色順を逆にするか | FALSE |
| order | 1から9までの数値ベクトルで、使用する色の順序を指定する | 1:9 |
| aesthetics | このスケールを適用する審美的属性の名前のベクトル | “fill” |
| … | colorRampPalette() へ渡す追加のオプション | なし |
# 産地ごとの平均テアニン含有量を棒グラフにし、Okabe-Ito配色を適用する
ggplot(産地平均, aes(x = 産地, y = テアニン, fill = 産地)) +
geom_col() +
scale_fill_okabeito()
# 色順を逆にし、3番目以降の色から使う
ggplot(産地平均, aes(x = 産地, y = テアニン, fill = 産地)) +
geom_col() +
scale_fill_okabeito(reverse = TRUE, order = 3:9)産地ごとの平均テアニン含有量を棒グラフにし、Okabe-Ito配色を適用する

色順を逆にし、3番目以降の色から使う

[塗りつぶしをMaterial Design配色にする]:scale_fill_materialコマンド
scale_fill_materialは、Material Designの色群を塗りつぶしに割り当てます。discreteで離散・連続を切り替え、paletteで「ice」や「contrast」などの部分集合を選べます。落ち着いた中間色が多く、区分の数が少ないグラフに向きます。
| オプション | 意味 | 初期値 |
|---|---|---|
| palette | 使用するパレット名。”full”、”ice”、”rainbow”、”contrast”、”light” などから選ぶ | NULL |
| discrete | 色の審美的属性が離散かどうかを示す論理値 | TRUE |
| reverse | パレットの色順を逆にするか | FALSE |
| aesthetics | このスケールを適用する審美的属性の名前のベクトル | “fill” |
| … | colorRampPalette() へ渡す追加のオプション | なし |
# 産地ごとのテアニン含有量の箱ひげ図にMaterial Design配色を適用する
ggplot(茶葉, aes(x = 産地, y = テアニン, fill = 産地)) +
geom_boxplot() +
scale_fill_material()
# 寒色系のiceパレットに切り替え、色順を逆にする
ggplot(茶葉, aes(x = 産地, y = テアニン, fill = 産地)) +
geom_boxplot() +
scale_fill_material(palette = "ice", reverse = TRUE)産地ごとのテアニン含有量の箱ひげ図にMaterial Design配色を適用する

寒色系のiceパレットに切り替え、色順を逆にする

[モダンな体裁に整える]:theme_modernコマンド
theme_modernは、背景の枠線や目盛線を減らし、余白を広めに取った体裁に変更します。base_sizeで全体の文字サイズを、legend.positionで凡例の位置を指定し、show.ticksにTRUEを渡すと目盛線が加わります。
| オプション | 意味 | 初期値 |
|---|---|---|
| base_size | 基準となるフォントサイズ(ポイント単位) | 11 |
| base_family | 基準となるフォントファミリー | “” |
| plot.title.size | タイトルのサイズ(ポイント単位)。”none” も指定できる | 1.35 * base_size |
| plot.title.face | タイトルの字体(”plain”、”italic”、”bold”、”bold.italic”) | “plain” |
| plot.title.space | タイトルの余白 | 1.8 * base_size |
| plot.title.position | タイトル・サブタイトルとキャプションの揃え位置。”panel” でパネルに、”plot” でプロット全体に揃える | “plot” |
| legend.position | 凡例の既定の配置(”none”、”left”、”right”、”bottom”、”top”、”inside”) | “right” |
| axis.title.space | 軸タイトルの余白 | 1.8 * base_size |
| axis.text.space | 軸と目盛ラベルの間隔 | base_size |
| legend.title.size | 凡例タイトルの文字サイズ(ポイント単位) | 1.2 * base_size |
| legend.text.size | 凡例の文字サイズ(ポイント単位)。”none” も指定できる | 1.1 * base_size |
| axis.title.size | 軸タイトルの文字サイズ(ポイント単位) | 1.2 * base_size |
| axis.title.face | 軸タイトルの字体(”plain”、”italic”、”bold”、”bold.italic”) | “plain” |
| axis.text.size | 軸ラベルの文字サイズ(ポイント単位) | 1.1 * base_size |
| axis.text.angle | x軸ラベルの回転角度 | NULL |
| tags.size | タグの文字サイズ(ポイント単位) | 1.35 * base_size |
| tags.face | タグの字体(”plain”、”italic”、”bold”、”bold.italic”) | “bold” |
| show.ticks | TRUE で内向きの目盛線を追加し、軸とラベルの間隔をやや広げる | FALSE |
| … | ggplot2::theme() へ渡す追加のオプション | なし |
# 産地ごとのテアニン含有量の箱ひげ図をモダンな体裁で描く
ggplot(茶葉, aes(x = 産地, y = テアニン, fill = 産地)) +
geom_boxplot() +
scale_fill_okabeito() +
theme_modern()
# 文字サイズを大きくし、凡例を下に置き、目盛線を表示する
ggplot(茶葉, aes(x = 産地, y = テアニン, fill = 産地)) +
geom_boxplot() +
scale_fill_okabeito() +
theme_modern(base_size = 14, legend.position = "bottom", show.ticks = TRUE)産地ごとのテアニン含有量の箱ひげ図をモダンな体裁で描く

文字サイズを大きくし、凡例を下に置き、目盛線を表示する

<おすすめのRに関する書籍です>
[分布を半分のバイオリンで示す]:geom_violinhalfコマンド
geom_violinhalfは、分布の密度を片側だけのバイオリンで描きます。flipで向きを、scaleで幅のそろえ方を指定します。中央線に沿って並ぶため、箱ひげ図より裾の形が読み取りやすくなります。
| オプション | 意味 | 初期値 |
|---|---|---|
| mapping | aes() で作成した審美的属性の対応付け | NULL |
| data | このレイヤーに表示するデータ。NULL のとき ggplot() のデータを引き継ぐ | NULL |
| stat | データに適用する統計変換 | “ydensity” |
| position | データに適用する位置調整 | “dodge” |
| trim | TRUE でバイオリンの裾をデータの範囲で切り詰める | TRUE |
| flip | 半バイオリンの向きを反転するか。数値ベクトルで反転する図形を個別に指定することもできる | FALSE |
| scale | “area” で全バイオリンの面積を、”count” で観測数に比例させ、”width” で最大幅をそろえる | c(“area”, “count”, “width”) |
| show.legend | このレイヤーを凡例に含めるかの論理値。NA で審美的属性が対応付けられていれば含める | NA |
| inherit.aes | FALSE で既定の審美的属性を継承せず上書きする | TRUE |
| … | layer() の params へ渡すその他のオプション。固定色などの静的な審美的属性を指定する | なし |
# 産地ごとのテアニン含有量の分布を半バイオリンで示す
ggplot(茶葉, aes(x = 産地, y = テアニン, fill = 産地)) +
geom_violinhalf() +
scale_fill_okabeito()
# 向きを反転し、面積ではなく最大幅をそろえる
ggplot(茶葉, aes(x = 産地, y = テアニン, fill = 産地)) +
geom_violinhalf(flip = TRUE, scale = "width") +
scale_fill_okabeito()産地ごとのテアニン含有量の分布を半バイオリンで示す

向きを反転し、面積ではなく最大幅をそろえる

[バイオリンと点を重ねて示す]:geom_violindotコマンド
geom_violindotは、片側のバイオリンと、反対側に積み上げた点を組み合わせて描きます。dots_sizeで点の大きさ、binwidthで点を積む間隔、position_dotsで点の位置を調整します。観測数が少ないときに、分布の形と実際の値を同時に示せます。
| オプション | 意味 | 初期値 |
|---|---|---|
| mapping | aes() で作成した審美的属性の対応付け | NULL |
| data | このレイヤーに表示するデータ。NULL のとき ggplot() のデータを引き継ぐ | NULL |
| trim | TRUE でバイオリンの裾をデータの範囲で切り詰める | TRUE |
| scale | “area” で全バイオリンの面積を、”count” で観測数に比例させ、”width” で最大幅をそろえる | c(“area”, “count”, “width”) |
| show.legend | このレイヤーを凡例に含めるかの論理値 | NA |
| inherit.aes | FALSE で既定の審美的属性を継承せず上書きする | TRUE |
| dots_size | 点のサイズの調整 | 0.7 |
| dots_color | 点の色の調整 | NULL |
| dots_fill | 点の塗りつぶし色の調整 | NULL |
| binwidth | 点を積み上げる際のビン幅。既定はデータ範囲の30分の1 | 0.05 |
| position_dots | 点の位置調整 | ggplot2::position_nudge(x = -0.025, y = 0) |
| … | layer() の params へ渡すその他のオプション | なし |
| size_dots | 点のサイズの調整 | dots_size |
| color_dots | 点の色の調整 | dots_color |
| fill_dots | 点の塗りつぶし色の調整 | dots_fill |
# 産地ごとの萎凋歩合について、分布の形と個々の観測を重ねて示す
ggplot(茶葉, aes(x = 産地, y = 萎凋歩合, fill = 産地)) +
geom_violindot() +
scale_fill_material()
# 点を大きくし、点を積む間隔を広げる
ggplot(茶葉, aes(x = 産地, y = 萎凋歩合, fill = 産地)) +
geom_violindot(dots_size = 1.2, binwidth = 0.15) +
scale_fill_material()産地ごとの萎凋歩合について、分布の形と個々の観測を重ねて示す

点を大きくし、点を積む間隔を広げる

[レーダーチャートの座標系にする]:coord_radarコマンド
coord_radarは、極座標を用いて軸を放射状に並べ、レーダーチャートを描きます。thetaで角度に対応する変数、startで開始角度、directionで回る向きを指定します。geom_polygonやgeom_lineと組み合わせ、theme_radarで軸の体裁を整えます。
| オプション | 意味 | 初期値 |
|---|---|---|
| theta | 角度に対応付ける変数(x または y) | “x” |
| start | 12時方向を基準とした開始位置のオフセット(ラジアン) | 0 |
| direction | 1 で時計回り、-1 で反時計回り | 1 |
| … | ggproto へ渡すその他のオプション | なし |
# 官能評価の点数を品種ごとにレーダーチャートで比較する
ggplot(官能, aes(x = 評価項目, y = 点数, color = 品種, group = 品種)) +
geom_polygon(fill = NA, linewidth = 1) +
coord_radar() +
theme_radar()
# 開始角度を回し、反時計回りにする
ggplot(官能, aes(x = 評価項目, y = 点数, color = 品種, group = 品種)) +
geom_polygon(fill = NA, linewidth = 1) +
coord_radar(start = pi / 4, direction = -1) +
theme_radar()官能評価の点数を品種ごとにレーダーチャートで比較する

開始角度を回し、反時計回りにする

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