からだにいい「ggplot2」パッケージを始めよう

『まだ、まだ、知らない、役に立つ情報?』として主にRのパッケージを紹介する、からだにいいものhttps://www.karada-good.netを公開してから約10年経過しました。この間に有用なRのパッケージが多数開発されると共にRはデータ分析のソフトウェアとして一定の地位を確立したと考えます。

特に、分析や作図に適した整然なデータ作成を目的としたパッケージ集の「tidyverse」パッケージの登場で、データ可視化の作業がかなり楽になりました。また、近年はAIが普及しRをよく知らなくとも解析コマンドが一瞬で提示される時代になり、マニュアルを確認せずともデータの解析が可能になっています。

でも、やはり基礎を知りながらコマンドを試すことは有益なのではと考え、「ggplot2」パッケージで作図する時の「あれ?なんだっけ?」の解決を目的に記事を作成しました。

本記事が少しでも、だれかの解析が楽になりますように!!そして、Rへの返しきれない感謝を込めて。

ブログ継続のためガジェットをつたない文章で紹介しています。目に優しいガジェットです。よろしかったらどうぞ。

【おすすめ!!】Quntis モニターライト Glow Plus|目の疲れを減らす最強デスクライト
在宅ワークや長時間のPC作業で「目が疲れる」「デスク周りが暗い」と感じたことはありませんか?そんな悩みを解決するのが、Quntis モニターライト Glow Plusです。これまでも、Quntis モ…

始める前に

念のため「R」と「RStudio」のサイトURLを紹介します。各サイトのDownloadから簡単に入手することができます。なお、インストールは、はじめに「R」、次に「RStudio」の順でおこないます。

「ggplot2」を始めよう!

以降の操作は全て「RStudio」でおこないます。「RStudio」の上部メニューより「File」下部の「New File」ボタンから「R Script」を選択します。そうすると、「RStudio」内に「Untitled1」が4分割された左上の画面に表示されます。この場所にコマンドを入力し、実行することで様々な作業が可能です。

パッケージのインストールと読み込み

まずは、「ggplot2」パッケージのインストールです。「ggplot2」パッケージのみでも、「ggplot2」パッケージを含む「tidyverse」パッケージのどちらかをインストールしてください。

おすすめは分析や作図に適した整然なデータ作成を目的としたパッケージ集の「tidyverse」パッケージです。本ドキュメントでは「ggplot2」パッケージ以外の説明は省略しますが、紹介コマンドでは「tibble」、「dplyr」パッケージや「%>%」コマンドを利用しています。

パッケージのインストールは下記のように「install.packages」コマンドを使用します。

#「ggplot2」パッケージのみ
install.packages("ggplot2")

#「tidyverse」パッケージ
install.packages("tidyverse")

そして、パッケージはインストールするだけでは使用することができません。使用するには「library」コマンドで目的のパッケージを読み込みます。なお、「library」コマンドによるパッケージの読み込みは「R」を終了するまで有効です。

では、目的の「ggplot2」パッケージを読み込んでみましょう。

#「ggplot2」パッケージの場合
library("ggplot2")

#「tidyverse」パッケージの場合
library("tidyverse")

なお、「tidyverse」パッケージを読み込むと収録されている各パッケージのバージョン情報と収録コマンドの競合情報(コンフリクト)が下記のように表示されます。

#「tidyverse」パッケージの読み込み
library("tidyverse")
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.2.1     ✔ readr     2.2.0
✔ forcats   1.0.1     ✔ stringr   1.6.0
✔ ggplot2   4.0.3     ✔ tibble    3.3.1
✔ lubridate 1.9.5     ✔ tidyr     1.3.2
✔ purrr     1.2.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

「ggplot2」パッケージの作図概念を知ろう!

「ggplot2」パッケージの作図概念を知ると作業効率が上がるだけでなく理想的な図を作成できると考えます。

「ggplot2」パッケージは

  1. 「ggplot」コマンドで作図ルールを作成。
  2. 「geom_Function」コマンドで作成するグラフを選択。
  3. 「facet_Function」、「scale_Function」、「coord_Function」、「stat_Function」コマンドでグラフの分割・データを変換。
  4. 「lab」、「guide」、「theme_Function」コマンドで図の体裁を調整
  5. 「ggsave」コマンドや「RStudio」から図を画像ファイル(pngやjpeg)で保存

の手順で作成するレイヤーを重ねて簡単に高品質な作図をおこなうことができます。

次から手順ごとにコマンドを紹介し、レイヤーを重ねて作図をおこなっていきます。

「ggplot」コマンドで作図ルールを作成

使用するデータは「ggplot2」パッケージに収録されている、ダイアモンドの価格、カラット、カット、カラーなど10項目、53,940行のデータである「diamonds」を利用します。

それでは「diamonds」を「utils::data」コマンドで読み込み、先頭10行を「utils::head」コマンドで表示してみましょう。

#diamondsの読み込み:「utils::data」コマンド
data(diamonds)

#先頭10行を表示:「utils::head」コマンド
#表示対象データ:xオプション
#表示数:nオプション
head(x = diamonds, n = 10)

参考「ggplot2」最大のルール:「縦持ちデータ(Long format)」への変換

エクセルなどで作成されたデータの多くは、横方向(列方向)にデータが並ぶ「横持ちデータ(Wide format)」です。例えば、「2020年の売上」「2021年の売上」「2022年の売上」がそれぞれ別の列になっている状態です。

しかし、「ggplot2」パッケージのデータは、原則として「1つの変数は1つの列にまとまっている(縦持ちデータ :Long format)」ことが必須です。

wide formatからLong formatにするには「tidyverse」パッケージ に収録されている「tidyr」パッケージの「pivot_longer」コマンドが便利です。

# 横持ちデータの例(架空の売上データ)
sales_data_wide <- tibble::tibble(
  Product = c("A", "B", "C"),
  Sales_2020 = c(100, 150, 200),
  Sales_2021 = c(120, 160, 210),
  Sales_2022 = c(130, 180, 250)
)

# 「tidyr」パッケージの「pivot_longer」コマンドで縦持ちに変換
sales_data_long <- sales_data_wide %>%
  tidyr::pivot_longer(
    cols = starts_with("Sales"), # "Sales"で始まる列を対象にする
    names_to = "Year",           # 元の列名を格納する新しい列名
    values_to = "Sales"          # 値を格納する新しい列名
  )

# 縦持ちになれば、色分け(fillやcolor)が簡単にできる!
ggplot(data = sales_data_long, mapping = aes(x = Year, y = Sales, fill = Product)) +
  geom_col(position = "dodge") +
  labs(title = "縦持ちデータに変換して作成したグループ別棒グラフ") +
  theme_minimal()

「ggplot2」パッケージで作図する際、もし「うまく色分けができない」「凡例が正しく出ない」と悩んだら、データが縦持ちになっているかを確認してみてください。

次に「ggplot」コマンドで「ggplot2」パッケージで作図する時の基礎となる作図ルールを作成します。「diamonds」データのセット以外にも、「mapping」オプションで「各軸のデータ」、「グループ基準」、「ラベル」、「色」などの体裁ルールが設定できます。

そして、体裁ルールはAesthetic mappings(美的マッピング)の「aes」コマンドで設定しますが、「ggplot」コマンドでの設定は必須ではなく、各「geom_Function」コマンドでも設定できます。

「ggplot2」パッケージで作図しよう

まずは「ggplot」コマンドで作図のベースとなる作図ルールを作成します。以降、BasePlotに作成した作図ルールを保存して作業を進めていきます。そして、BasePlotを実行すると作図ルールに従った基本となるレイヤーが表示されます。

#「diamonds」データを「ggplot」コマンドにセット
BasePlot <- ggplot(data = diamonds,
                   mapping = aes(x = color,
                                 y = price,
                                 fill = cut))
#BasePlotをプロット
BasePlot

「geom_Function」コマンドで作成するグラフを選択

以降は「geom_Function」コマンドを利用してグラフを作成します。例では「geom_boxplot」コマンドで箱ひげ図を作成します。他グラフの「geom_Function」コマンドは「geom_Function」コマンドの章で紹介します。

#棒グラフを選択:「geom_boxplot」コマンド
BasePlot +
  geom_boxplot()

「facet_Function」コマンドでグラフを分割。「stat_Function」、「scale_Function」、「coord_Function」コマンドでデータを変換

「facet_Function」コマンドは指定した指標でグラフを分割するコマンドです。ここでは、行と列を指定してグラフを分割する「facet_wrap」コマンドを紹介します。

「stat_summary」コマンドはデータから指定した「function」で統計量を求めグラフに指定した「geom_Function」を追加するコマンドです。

ここでは、「facet_wrap」コマンドでグラフを分割後、白色のポイントを各平均値に追加する「stat_summary」コマンドを紹介します。

#グラフを分割:「facet_wrap」コマンド
BasePlot +
  geom_boxplot() +
  facet_wrap(facets = ~cut)
#グラフを分割後に追記:「stat_summary」コマンド
BasePlot +
  geom_boxplot() +
  facet_wrap(facets = ~cut) +
  stat_summary(fun = mean, geom = "point",
               size = 1, col = "white")

「lab」コマンド、「guide」コマンド、「coord_Function」コマンド、「theme_Function」コマンドでグラフの体裁を調整

ここでは、グラフのタイトルや軸ラベル、凡例の位置、座標軸の変換、そして全体のデザイン(テーマ)を一気に整えて、レポートや論文で使えるような美しいグラフに仕上げてみましょう。

labsコマンドでタイトルや軸ラベルの変更、coord_flipコマンドでx軸とy軸の反転、そしてtheme_bw(白黒を基調としたテーマ)とthemeコマンドを組み合わせて全体の見た目を調整します。

# グラフの体裁を総合的に調整
BasePlot +
  geom_boxplot() +
  facet_wrap(facets = ~cut) +
  stat_summary(fun = mean, geom = "point",
               size = 1, col = "white") +
  # タイトルと軸ラベルの設定:「labs」コマンド
  labs(title = "ダイアモンドの価格とカラーの関係",
       subtitle = "カットグレード別の比較",
       x = "カラー (D:最高 - J:最低)",
       y = "価格 (USドル)",
       fill = "カット") +
  # x軸とy軸を反転:「coord_flip」コマンド
  coord_flip() +
  # 全体のテーマを白黒ベースに変更:「theme_bw」コマンド
  theme_bw() +
  # 凡例の位置を下部に移動:「theme」コマンド
  theme(legend.position = "bottom")

全体のテーマ(体裁)を一括で適用する設定

「theme_Function」コマンドで図の体裁を調整 する方法を都度紹介してきました。しかし、論文やレポートを執筆する際、すべてのグラフに毎回、「labsコマンド」や「themeコマンド」などを書き足すのは手間です。

コマンドの冒頭で、体裁にかかわるコマンドを記述しておくと、以降に描画されるすべてのグラフのテーマを設定することができ便利です。

# 1. テーマの設定は「theme_set」のみで行う
theme_set(theme_bw(base_size = 12, base_family = "sans"))

# 2. 共通で使いたい「ラベル」や「軸の反転」などのパーツを list() で変数にまとめる
my_settings <- list(
  labs(title = "ダイアモンドの価格とカラーの関係",
       subtitle = "カットグレード別の比較",
       x = "カラー (D:最高 - J:最低)",
       y = "価格 (USドル)",
       fill = "カット"),
  coord_flip()
)

# 3. グラフを描画する際、先ほど作った共通パーツ(my_settings)を足す
# ※テーマ(theme_bw)は設定済みなので自動で適用されます
BasePlot +
  geom_boxplot() +
  my_settings

ここまでが「ggplot2」パッケージの基本的なレイヤー構造と作図の作法です。ルール(aes)を作り、グラフ(geom)を選び、分割(facet)や調整(themeなど)を重ねていく感覚が掴めたのではないでしょうか。

「geom_Function」コマンド

「ggplot2」には、多種多様なグラフを描画するための「geom_(ジオム)」コマンドが用意されています。ここでは、データ分析で頻繁に使用される代表的な「geom_Function」をいくつか紹介します。

目的に合わせて「どのgeomを選ぶか」が、データ可視化の最初の鍵となります。

散布図:geom_point

2つの連続変数の関係性を見るには散布図が適しています。ここではダイアモンドの「カラット(重さ)」と「価格」の関係を見てみましょう。データ数が多いので、alphaオプションで透明度を指定すると点の重なりが分かりやすくなります。

# 散布図の作成:「geom_point」コマンド
ggplot(data = diamonds,
       mapping = aes(x = carat, y = price, color = cut)) +
  geom_point(alpha = 0.3) +
  labs(title = "カラットと価格の散布図") +
  theme_minimal()

ヒストグラム:geom_histogram

1つの連続変数の分布(データの散らばり具合)を確認するには、ヒストグラムを使用します。「価格」がどのように分布しているかを確認します。binsオプションで階級の数を調整できます。

# ヒストグラムの作成:「geom_histogram」コマンド
ggplot(data = diamonds,
       mapping = aes(x = price, fill = cut)) +
  geom_histogram(bins = 30, color = "black", alpha = 0.7) +
  labs(title = "価格の分布(ヒストグラム)") +
  theme_minimal()

棒グラフ:geom_bar / geom_col

カテゴリごとのデータの件数や合計値を比較する場合は棒グラフを使います。データの件数(行数)をそのままカウントして棒グラフにする場合はgeom_barを使用します。

# 件数のカウントによる棒グラフ:「geom_bar」コマンド
ggplot(data = diamonds,
       mapping = aes(x = color, fill = cut)) +
  geom_bar(position = "dodge") + # dodgeで横並びに配置
  labs(title = "カラー別のダイアモンド件数") +
  theme_minimal()

もし既に集計済みのデータ(y軸の値が計算済み)を使って棒グラフを描きたい場合は、geom_bar(stat = “identity”)とするか、より簡単なgeom_col()コマンドを使用してください。

折れ線グラフ:geom_line

時系列データなどの推移や変化を見る際によく使用されるのが折れ線グラフです。ここでは、「ggplot2」パッケージに標準で収録されている米国の経済指標データ「economics」を使用して、失業者数(unemploy)の推移を可視化してみましょう。

# データの先頭を確認
head(economics)
# 折れ線グラフの作成:「geom_line」コマンド
ggplot(data = economics,
       mapping = aes(x = date, y = unemploy)) +
  geom_line(color = "blue", linewidth = 1) +
  labs(title = "米国の失業者数の推移",
       x = "年",
       y = "失業者数(千人)") +
  theme_minimal()

散布図に近似曲線を追加する:geom_smooth

散布図を描いた後に「データ全体の傾向」を示す直線を引きたくなることがよくあります。「ggplot2」では、レイヤーを重ねるという概念を活かして、geom_pointの上にgeom_smoothコマンドを重ねるだけで簡単に近似曲線を追加できます。

method = “lm”(Linear Model:線形モデル)を指定することで、直線の回帰式の近似曲線を引くことができます。

# 散布図に回帰直線を追加:「geom_smooth」コマンド
ggplot(data = diamonds,
       mapping = aes(x = carat, y = price)) +
  geom_point(alpha = 0.1, color = "darkgray") + # 点はグレーで薄く表示
  geom_smooth(formula = "y ~ x", method = "lm", color = "red", linewidth = 1.2) + # 赤い回帰直線を追加
  labs(title = "カラットと価格の関係および回帰直線") +
  theme_minimal()

データ分布の表現:geom_violin

箱ひげ図(geom_boxplot)はデータの四分位などを示すのに便利ですが、データの山(分布の形状)まではわかりません。そこで近年よく使われるのが、バイオリンプロット(geom_violin)です。バイオリンの幅が広い部分ほど、その価格帯のデータ(ダイアモンド)が多く存在していることを直感的に理解できます。

# バイオリンプロットの作成:「geom_violin」コマンド
ggplot(data = diamonds,
       mapping = aes(x = cut, y = price, fill = cut)) +
  geom_violin(alpha = 0.7) +
  labs(title = "カット別の価格分布(バイオリンプロット)") +
  theme_minimal() +
  theme(legend.position = "none") # 凡例を非表示

時系列データの扱い方(日付軸の細かな調整など)

時間の経過とともに変化するデータのプロットは「geom_line」コマンドを使用します。しかし、X軸が日付(Date)データの場合、初期値だと「目盛りが細かすぎて文字が重なる」ことや軸ラベルを「2023-01-01ではなく、2023年1月と表示したい」場合があります。

このような日付データの軸を調整するには、「scale_x_date」コマンド(データが日時情報を含む場合は「scale_x_datetime」コマンド)を使用します。

「date_breaks」オプションには、“1 year”(1年ごと)や “6 months”(6ヶ月ごと)といった直感的な間隔を指定可能です。 なお、「date_labels」オプションでは、%Y(4桁の年)、%y(2桁の年)、%m(月)、%d(日)などの記号を組み合わせて、「%Y年%m月」のように自由なフォーマットを指定することが可能です。

# 日付軸の調整:「scale_x_date」コマンド
# 目盛りの間隔: date_breaksオプション
# 表示フォーマット: date_labelsオプション
ggplot(data = economics, mapping = aes(x = date, y = unemploy)) +
  geom_line(color = "blue") +
  scale_x_date(date_breaks = "5 years", date_labels = "%Y年") +
  labs(title = "米国の失業者数の推移(日付軸の調整)",
       x = "年",
       y = "失業者数(千人)") +
  theme_minimal()

円グラフの作り方

「ggplot2」パッケージには「geom_pie」のような円グラフ専用のコマンドが存在しません。 「ggplot2」パッケージでは、「積み上げ棒グラフを作成し、その座標軸を円形(極座標)に歪める」手順で作成します。

# 円グラフ用のサンプルデータを作成
pie_data <- tibble::tibble(
  category = c("A", "B", "C"),
  value = c(40, 35, 25))

# 1. まずは「積み上げ棒グラフ」を作成する
# X軸には何も指定しない("")ことで、1本の棒にします
BasePie <- ggplot(data = pie_data, 
                  mapping = aes(x = "", y = value, fill = category)) +
  geom_col(color = "white") # 枠線を白にして区切りを見やすくします

# 2. 座標を極座標(円形)に変換:「coord_polar」コマンド
BasePie +
  coord_polar(theta = "y") +
  labs(title = "円グラフの作成") +
  # 背景や軸線を全て消す「theme_void」コマンドが円グラフには便利です
  theme_void()

作成したグラフの保存

作図手順の5つ目でお伝えした通り、「ggsave」コマンドや「RStudio」から図を画像ファイル(pngやjpeg)で保存することができます 。 RStudioの右下にある「Plots」ペインの「Export」ボタンから手動で保存することも可能ですが、再現性を高めるためにはコマンドでの保存が推奨されます。

# 直前のグラフを保存する:「ggsave」コマンド
ggsave(filename = "my_diamond_plot.png", 
       width = 8,    # 幅
       height = 6,   # 高さ
       dpi = 300)    # 解像度(高画質に保存)

変数に保存したプロット(例:BasePlot)を保存したい場合は、plot = BasePlotというオプションを追加するだけで任意のグラフを出力できます。 以下がコード例です。

# 変数「BasePlot」に保存されたグラフを指定して保存する
ggsave(filename = "my_base_plot.png", 
       plot = BasePlot,      # 保存したい変数名を指定
       width = 8, 
       height = 6, 
       dpi = 300)

さらなるステップアップ:思い通りのグラフに仕上げる

データ分析やレポート・論文作成において、「ggplot2」を自由自在に操るためには、いくつか覚えておきたいコマンドがあります。

色をカスタマイズする:scale_color_ / scale_fill_

デフォルトの色使いも自身で確認する範囲だと十分ですが、プレゼンなどでは状況に合わせて色を細かく変更したい場面があります。そんな時には「scale_color_」または「scale_fill_」で始まるコマンドを使います。

# 手動で色を指定する: scale_fill_manual
BasePlot +  
  geom_boxplot() +
  scale_fill_manual(values = c("Fair" = "#E41A1C",
                               "Good" = "#377EB8",
                               "Very Good" = "#4DAF4A",
                               "Premium" = "#984EA3",
                               "Ideal" = "#FF7F00")) +
  labs(title = "手動でカラーパレットを設定した箱ひげ図") +
  theme_minimal()

「scale_color_」または「scale_fill_」の違いは、色が適用される図形要素の場所です。 ・color (scale_color_): 点(散布図のプロットなど)、線(折れ線グラフなど)、または図形(棒グラフや箱ひげ図)の「枠線」の色を変更します。 ・fill (scale_fill_): 棒グラフ、箱ひげ図、バイオリンプロットといった面を持つ図形の「塗りつぶし(内部)」の色を変更します。

「scale_color_」または「scale_fill_」のコマンド一覧と役割は以下の通りです。

コマンド役割適用データ
scale_*_manual()カラーコードや色名(“red”等)で手動で任意の色を指定する離散型(カテゴリ)
scale_*_brewer()カラーパレットを適用する離散型(カテゴリ)
scale_*_gradient()2色を指定し、グラデーションで連続的な数値を表現する連続型(数値)
scale_*_viridis_c()色覚多様性に配慮された、美しく視認性の高いグラデーションを適用する

※注: 上記の * 部分に color または fill が入ります

軸の範囲や目盛りを調整する:scale_x_ / scale_y_

「外れ値を除外してグラフの特定の部分だけをズームしたい」「軸を対数スケールにしたい」などの軸表示の設定を変更する場合は、「scale_x_」または「scale_y_」で始まるコマンドを使います。

# Y軸の表示範囲を制限する (例: 0から10000ドルまで)
ggplot(data = diamonds, mapping = aes(x = carat, y = price)) +
  geom_point(alpha = 0.3) +
  scale_y_continuous(limits = c(0, 10000)) +
  labs(title = "Y軸の範囲を0〜10000に制限した散布図") +
  theme_minimal()
# Y軸を対数スケール(log10)に変換する(価格の幅が広すぎる場合に有効)
ggplot(data = diamonds, mapping = aes(x = carat, y = price)) +
  geom_point(alpha = 0.3) +
  scale_y_log10() +
  labs(title = "Y軸を対数スケールにした散布図") +
  theme_minimal()

「scale_x_」または「scale_y_」のコマンド一覧と役割は以下の通りです。

コマンド役割適用データ
scale_*_continuous()連続変数の軸を調整。limits(範囲)や breaks(目盛りの間隔)を指定可能。連続型(数値)
scale_*_discrete()カテゴリ変数の軸を調整。項目の並び順の変更や、特定のラベルの非表示が可能。離散型(カテゴリ)
scale_*_log10()軸を対数スケール(底が10)に変換。値のばらつきが極端に大きいデータに有効。連続型(数値)
scale_*_date()日付データの軸を調整。date_breaks = “1 month” のように期間単位で目盛りを設定。

※注: 上記の * 部分に x または y が入ります

グラフ内にテキストやラベルを追加する:geom_text / geom_label

特定のデータ点に具体的な数値を表示したり、グラフ内に注釈を入れたりする機能です。geom_textは文字だけを配置し、geom_labelは文字の背景に枠を追加してより見やすくします。

# 平均価格のデータフレームを簡易的に作成してラベルを追加する例
# (※「dplyr」パッケージの機能を使用しています)
summary_data <- diamonds %>%
  group_by(cut) %>%
  summarise(mean_price = mean(price))

ggplot(data = summary_data, mapping = aes(x = cut, y = mean_price)) +
  geom_col(fill = "skyblue") +
  geom_label(mapping = aes(label = round(mean_price, 0)), vjust = -0.5) +
  scale_y_continuous(limits = c(0, 5500)) +
  labs(title = "カット別の平均価格(数値ラベル付き)") +
  theme_minimal()

グラフ内の自由な位置に注釈や矢印を追加する:「annotate」コマンド

データに基づくラベルではなく、「この外れ値に注目してほしい」「ここの領域が重要」といった説明書きや矢印を、グラフ上の任意の座標(x軸、y軸の位置)に直接配置したい場合は、「annotate」コマンドを使用します。

# グラフ内に注釈を配置:「annotate」コマンド
# 配置する種類: geomオプション("text"や"segment"など)
ggplot(data = diamonds, mapping = aes(x = carat, y = price)) +
  geom_point(alpha = 0.1, color = "darkgray") +
  # テキスト(文字)の配置
  annotate(geom = "text", x = 4, y = 15000, 
           label = "注目すべき高価格・大粒データ", size = 5, color = "red") +
  # 矢印(セグメント)の配置
  annotate(geom = "segment", x = 4, y = 14000, xend = 3.5, yend = 10000, 
           color = "red", arrow = arrow(length = unit(0.3, "cm")), linewidth = 1) +
  labs(title = "特定の領域に注釈と矢印を追加した散布図") +
  theme_minimal()

デザインを細部まで調整する:「theme」コマンド

「凡例をグラフの上部に移動させたい」「背景の薄い枠線を完全に消したい」「タイトルの文字を太字にして中央に寄せたい」といった、細部へのこだわりを実現するのが「theme」コマンドです。「theme」コマンド内に「element_text」、「element_line」、「element_blank(非表示)」などのオプションを組み合わせることで、理想の図を作成できると思います。

「theme」コマンドは、グラフの細かなデザイン要素(フォント、背景色、グリッド線、凡例の位置など)を自由に操作するための非常に強力なコマンドです。

しかし、「theme」コマンドを使いこなすためには、設定したい要素に対して「どのような装飾をおこなうか」を指定する4つの「element_(エレメント)」コマンドを理解する必要があります。「element_(エレメント)」コマンドの概要は下記のとおりです。

コマンド役割主なオプション
element_text()文字(テキスト)の装飾size(文字サイズ), color(文字色), face(“bold”太字など), hjust(水平位置), vjust(垂直位置), angle(回転角度), family(フォント)
element_line()直線(グリッド線や軸線)の装飾color(線の色), linewidth(線の太さ), linetype(“dashed”破線など)
element_rect()矩形(背景や枠)の装飾fill(塗りつぶし色), color(枠線の色), linewidth(枠線の太さ)
element_blank()要素の非表示オプションなし。指定した要素を完全に消去します。

「theme」コマンドの設定オプションのまとめ

カテゴリごとに設定できる主なオプションを表にまとめました。表内の「対応element_(エレメント)」で使用します。

プロット全体(Plot)の体裁

グラフ画像全体の余白やタイトル、背景などを設定します。

オプション名役割対応element_(エレメント)
plot.background画像全体の背景element_rect()
plot.titleメインタイトルの体裁element_text()
plot.subtitleサブタイトルの体裁element_text()
plot.caption キャプション(図の右下などの注記)の体裁element_text()
plot.margin画像周囲の余白margin(t, r, b, l, “pt”) (上・右・下・左の順)
plot.title.positionタイトルの配置基準“panel” (パネル基準) または “plot” (画像全体基準)

領域(パネル)の体裁

データ(点や棒など)がプロットされる内側の領域(パネル)を設定します。

オプション名役割対応element_(エレメント)
panel.backgroundデータ描画領域の背景element_rect()
panel.borderデータ描画領域を囲む枠線element_rect(fill = NA) ※塗りつぶしなしにする
panel.gridすべてのグリッド線(網目)element_line()
panel.grid.major主グリッド線(目盛りのある太い線)element_line()
panel.grid.minor補助グリッド線(目盛りと目盛りの間の細い線)element_line()
panel.grid.major.xX軸の主グリッド線(縦線)のみを指定element_line()
panel.grid.major.yY軸の主グリッド線(横線)のみを指定element_line()

軸の体裁

X軸およびY軸の線、目盛り、ラベルを設定します。「オプション名」の最後に.x または .y をつけると軸が指定できます。例)axis.text.x

オプション名役割対応element_(エレメント)
axis.line軸そのものelement_line()
axis.title軸のタイトル(“カラット”や”価格”など)element_text()
axis.text軸の目盛りラベルの文字(“1000”や”Ideal”など)element_text()
axis.text.xX軸の目盛りラベルのみを指定(斜めにする時など)element_text(angle = 45, hjust = 1)
axis.ticks軸から少し突き出た目盛り線element_line()
axis.ticks.length目盛り線の長さunit(0.2, “cm”) などの単位指定

凡例の体裁

凡例の位置や体裁を設定します。

オプション名役割対応element_(エレメント)
legend.position配置の場所“none”(非表示), “right”, “left”, “bottom”, “top”, または座標 c(x, y)
legend.directionラベルの並び方向“vertical” (縦並び) または “horizontal” (横並び)
legend.background凡例の背景の塗色element_rect()
legend.key各項目の背景の塗色element_rect()
legend.title凡例のタイトルelement_text()
legend.text凡例の各項目の文字element_text()
legend.box.background凡例全体を囲む枠element_rect()

分割領域の体裁

「facet_wrap」コマンドなどでグラフを分割した際に上部に表示される見出しの体裁を設定します。

オプション名役割対応element_(エレメント)
strip.background見出し領域の背景element_rect()
strip.text 見出しの文字element_text()
strip.placement見出しの位置(軸ラベルの外側か内側か)“inside” または “outside”
panel.spacing分割したグラフとグラフの間の余白unit(1, “lines”) などの単位指定

オプションを組み合わせた例

必要な「element_」コマンドを組み合わせていくことで、下記のような細かな体裁制御が可能です。 例を参考に様々なオプションの数値を変更して、ご自身の理想の体裁を設定してみてください。

# オプションを組み合わせた例
BasePlot + 
  geom_boxplot() +
  theme(
    # グラフ全体の背景を薄いアイボリーに
    plot.background = element_rect(fill = "#FFFFF0", color = NA),

    # メインタイトルを太字にして中央揃え
    plot.title = element_text(face = "bold", hjust = 0.5, size = 16),

    # パネルの枠線を黒く太くし、背景を白に
    panel.border = element_rect(color = "black", fill = NA, linewidth = 1),
    panel.background = element_rect(fill = "white"),

    # 補助グリッド線を非表示(blank)にし、主グリッド線をグレーの破線に
    panel.grid.minor = element_blank(),
    panel.grid.major = element_line(color = "gray80", linetype = "dashed"),

    # X軸の目盛り文字を45度傾ける
    axis.text.x = element_text(angle = 45, hjust = 1),

    # 凡例をグラフ内の右上に配置し、枠線をつける
    legend.position = c(0.85, 0.65),
    legend.background = element_rect(fill = "white", color = "black")
  )

少しでも、だれかの解析が楽になりますように!!

Prices and shipping availability may change. Please refer to the product page at time of purchase.
Content displayed on this site is provided by Amazon and may be updated or removed.
Amazon Associate, karada-good earns income through qualifying sales.
タイトルとURLをコピーしました