7 ggplot2の初歩

7.1 はじめに

このページでは、ggplot2 パッケージを使ってグラフを作成し、画像として保存するまでの基本的な流れを解説します。

具体的には、ggplot2 の中核となる data(データ)、aes(マッピング)、geom(ジオメトリ)という3つの基本要素を理解し、代表的なグラフである「散布図」と「棒グラフ」を作成します。

最後に、labs() でグラフにラベルを付け、theme_*() でデザインを整え、ggsave() でファイルを保存する方法までを解説します。この記事を終えれば、ggplot2 でグラフを作成する一連の流れを知ることができます。

ggplot2 のより幅広い扱い方についてはggplot2によるデータの可視化のページで解説します。

7.1.1 ggplot2について

数値が羅列されたデータから、その特徴や傾向を読み取ることは容易ではありません。データ可視化は、データに含まれるパターンや関係性を視覚的に表現することで直感的な理解を助けるための手法です。

R言語には多数の作図パッケージが存在しますが、ggplot2は最もよく利用されています。ggplot2は、一貫した文法に基づいて、柔軟かつ再現性の高いグラフ作成を可能にする点が特徴です。このページでは、ggplot2を用いたデータ可視化の基本的な手順を解説します。

7.1.2 グラフの文法 (Grammar of Graphics)

ggplot2は、「グラフの文法 (Grammar of Graphics)」という思想に基づいています。これは、「グラフを構成する要素を個別の部品(レイヤー)として定義し、それらを体系的に積み重ねて作図を行う」という考え方です。

グラフは主に以下の3つの基本要素から構成されます。

  • データ (data): グラフ化する対象のデータセット。
  • マッピング (aes): データの変数を、X軸、Y軸、色、サイズといったグラフの視覚的要素にどのように対応させるかの設定。
  • ジオメトリ (geom): 点、線、棒といった、データを表現するための図形の指定。

これらの要素を + 記号で結合していくことでグラフを構築するというのが ggplot2 の基本的な操作です。この構造を用いることで、単純なグラフから複雑なグラフまで、統一的な形式でグラフを作成することができます。

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

まだ ggplot2 を インストールしていない場合は、以下のコマンドを Console で実行してインストールを行います。

install.packages("ggplot2")

インストールが完了したら、Rのセッション(RStudioを起動するたびに新しいセッションになります)を開始するごとにlibrary()関数を使ってパッケージを読み込みます。これにより、パッケージ内の関数やデータが利用可能になります。

library(ggplot2)

7.1.4 penguinsデータセット

このページの解説では、palmerpenguins パッケージに含まれる penguins データセットを使用します。このデータセットには、南極のパーマー群島に生息する3種類のペンギン(アデリー、ジェンツー、ヒゲ)の様々な測定データが格納されています。

まず、パッケージをインストールします。

install.packages("palmerpenguins")

データセットの最初の数行を確認するにはhead()関数を、全体の構造や各列のデータ型を確認するにはstr()関数を使用します。

library(palmerpenguins)

# データセットの先頭6行を表示
head(penguins)
## # A tibble: 6 × 8
##   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
##   <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
## 1 Adelie  Torgersen           39.1          18.7               181        3750
## 2 Adelie  Torgersen           39.5          17.4               186        3800
## 3 Adelie  Torgersen           40.3          18                 195        3250
## 4 Adelie  Torgersen           NA            NA                  NA          NA
## 5 Adelie  Torgersen           36.7          19.3               193        3450
## 6 Adelie  Torgersen           39.3          20.6               190        3650
## # ℹ 2 more variables: sex <fct>, year <int>

# データセットの構造を表示
str(penguins)
## tibble [344 × 8] (S3: tbl_df/tbl/data.frame)
##  $ species          : Factor w/ 3 levels "Adelie","Chinstrap",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ island           : Factor w/ 3 levels "Biscoe","Dream",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ bill_length_mm   : num [1:344] 39.1 39.5 40.3 NA 36.7 39.3 38.9 39.2 34.1 42 ...
##  $ bill_depth_mm    : num [1:344] 18.7 17.4 18 NA 19.3 20.6 17.8 19.6 18.1 20.2 ...
##  $ flipper_length_mm: int [1:344] 181 186 195 NA 193 190 181 195 193 190 ...
##  $ body_mass_g      : int [1:344] 3750 3800 3250 NA 3450 3650 3625 4675 3475 4250 ...
##  $ sex              : Factor w/ 2 levels "female","male": 2 1 1 NA 1 2 1 2 NA NA ...
##  $ year             : int [1:344] 2007 2007 2007 2007 2007 2007 2007 2007 2007 2007 ...

上記のstr()の結果から、このデータセットには数値型 (num, int) の変数と、カテゴリを表現する因子型 (Factor) の変数が含まれていることがわかります。

Console で以下の命令を実行すれば penguins データセットの中身が表形式で確認できます。

View(penguins)

このデータにどのような名前の列があるか、それらがどのような値であるかを確認してください。

このような数字の表のみでは、このデータにどのような特徴があるのかはよくわかりません。これから図を作成し、このデータの特徴を明らかにしましょう。

7.2 ggplot2の基本構造:3つの必須要素

ggplot2 による作図は、一貫した文法に基づいています。どのようなグラフも、基本的には以下の3つの必須要素を+記号で組み合わせて作成します。

7.2.1 3つの必須要素(data, aes, geom)

  1. データ(data)
    グラフ化したい情報が格納されたデータフレームです。ggplot() 関数の最初の引数として指定します。
  2. マッピング(aes)
    aes(Aesthetic mappings: 美的マッピング)は、データフレームの「どの列(変数)」を、グラフの「どの視覚的要素(X軸、Y軸、色、サイズ、形など)」に対応させるかを指定します。ggplot() 関数の中で設定するのが一般的です。
  3. ジオメトリ(geom)
    geom (Geometric objects) は、データをどのような形状で表現するかを指定するレイヤーです。例えば、geom_point() は散布図(点)を、geom_bar() は棒グラフを意味します。

7.2.2 最初のグラフ:ペンギンの体重とクチバシの長さ

それでは、3つの必須要素を使って、散布図を作成してみましょう。penguins データを使い、X軸にクチバシの長さ (bill_length_mm)、Y軸に体重 (body_mass_g) をマッピングし、点 (geom_point) でプロットします。

# 冒頭で必要なパッケージを読み込んでおく
library(ggplot2)
library(palmerpenguins)

# penguins データを dat という変数に格納する
dat = palmerpenguins::penguins

# 3つの要素(data, aes, geom)を組み合わせる
fig = ggplot(dat, aes(x = bill_length_mm, y = body_mass_g)) +
  geom_point()
plot(fig)

このコードは、以下の処理を実行しています。

  1. ggplot(dat, ...)
    まず ggplot() 関数でグラフの土台(キャンバス)を作成し、使用するデータ (dat) を指定します。
  2. aes(x = bill_length_mm, y = body_mass_g)
    aes() を使い、X軸に bill_length_mm 列を、Y軸に body_mass_g 列を割り当てることを指示します。この時点ではまだキャンバスだけで、データは描画されません。
  3. geom_point()
    指定されたマッピングに基づいてデータを点として描画することを指示します。ここで初めてグラフが視覚化されます。

そして、ggplot()関数の結果をfigという変数に格納しておき、plot()関数を使ってグラフを表示させています。

ggplot2ではこのように、ggplot()で土台とマッピングを設定し、geom 系の関数を使ってグラフの種類を決定するというのが基本的な流れです。

7.2.3 マッピング (aes) と 設定 (setting) の違い

ggplot2を扱う上で非常に重要な概念が、「マッピング」と「設定」の区別です。これは、グラフの視覚的要素(色、形、サイズなど)を、データに連動させるか、固定値にするかの違いです。

1. マッピング (Mapping)

  • aes()の中で指定します。
  • 「データの値に応じて視覚的要素を変化させる」という指示です。
  • 自動的に凡例(はんれい)が生成されます。

例えば、ペンギンの種 (species) ごとにグラフの点の色を変えたい場合は、aes()の中にcolor = speciesと記述します。

# 色を aes() の中でを指定(マッピング)する場合
fig = ggplot(dat, aes(x = bill_length_mm, y = body_mass_g, color = species)) +
  geom_point()
plot(fig)

この結果、species 列の3つの異なる値(Adelie, Chinstrap, Gentoo)に対して自動的に3つの色が割り当てられ、どの色がどの種に対応するかを示す凡例がグラフの横に表示されます。

2. 設定 (Setting)

  • aes()の外で、geom 系の関数の引数として指定します。
  • 「データに関係なく全ての要素を特定の値(例: "blue")に固定する」という指示です。
  • 凡例は生成されません。

例えば、全ての点を青色にしたい場合は、geom_point()の中にcolor = "blue"と記述します。

# # 色を geom_point() の中でを指定(設定)する場合
fig = ggplot(data = dat, aes(x = bill_length_mm, y = body_mass_g)) +
  geom_point(color = "blue")
plot(fig)

この結果、データの内容とは無関係にすべての点が青色で描画されます。

"blue"以外にもさまざまな色を指定できます。こちらのページの冒頭に利用できる色名の一覧の図があります。

よく使う色名として、gray系の色名があります。たとえば、color = "gray80"とすると白に近い灰色になり、color = "gray20"とすると黒に近い灰色になるというように、grayに透明度の数字を合わせた名前を使うことでいろんな階調の灰色を簡単に指定することができます。

また、色名には16進数の色コードを使うこともできます。下記の#00afccという部分が色コードです。

# # 色を geom_point() の中でを指定(設定)する場合
fig = ggplot(data = dat, aes(x = bill_length_mm, y = body_mass_g)) +
  geom_point(color = "#00afcc")
plot(fig)

このようなページからいい感じの色(のカラーコード)を見つけるとよいでしょう。

よくあるミス

もしaes(color = "blue")のように、aes()の中で固定値を指定すると、ggplot2はこれを「“blue” という名前のカテゴリ」として扱おうとします。

# 間違った例: aes()の中に固定値を指定
fig = ggplot(data = dat, aes(x = bill_length_mm, y = body_mass_g, color = "blue")) +
  geom_point()
plot(fig)

この場合、グラフは意図した青色にはならず、“blue” というラベルが付いた凡例が(意図せず)作成されてしまいます。

データに連動させる場合はaes()の中、固定値にする場合はaes()の外、と覚えてください。

7.2.4 複数のマッピングを行う

先ほどはペンギンの種 (species) で色分けを行いましたが、今度は生息する島 (island) で色分けしてみます。

fig = ggplot(dat, aes(x = bill_length_mm, y = body_mass_g, color = island)) +
  geom_point()
plot(fig)

色だけではなく、点の形もマッピングすることができます。ここでは island で色分けした状態で、さらに species で形も分けてみましょう。

また、大量の点があるグラフでは点同士が重なってしまい複数の点がひとつに見えてしまうことがあります。このような場合はgeom_point()の中で alpha(透明度)を設定します。alpha は 0(透明)から 1(不透明)までの値を指定します。

fig = ggplot(dat, aes(x = bill_length_mm, y = body_mass_g, color = island, shape = species)) +
  geom_point(alpha = 0.6)
plot(fig)

透明度を0.6 (60%) に指定したので、全体的に図が薄くなりました。複数の点が重なっている箇所は色が濃くなっています。ただ、今回のデータでは点の重なりはあまり無く、濃い箇所は多くありません。このようなデータの場合は透明度を変える意味はあまりないかもしれません。

点の形状で性別が表現されています。ただ、それぞれの点が小さいせいで形の違いがよくわかりません。そこで、geom_point()の中で size(大きさ)を設定してみます。

fig = ggplot(dat, aes(x = bill_length_mm, y = body_mass_g, color = island, shape = species)) +
  geom_point(size = 3)
plot(fig)

点が大きくなったことで形の区別はつきやすくなりました。しかし、点同士の重なりも強くなっています。そこで、再び透明度を指定することにします。今回は透明度を 75% に指定しました。

fig = ggplot(dat, aes(x = bill_length_mm, y = body_mass_g, color = island, shape = species)) +
  geom_point(size = 3, alpha = 0.75)
plot(fig)

これで、複数の色や形が重なっている箇所が見えやすくなり、それ以外の点も色が薄すぎて見えにくいということはなくなりました。

このように、図を作る際はデータが見やすくなるように色や形などの要素を試行錯誤で調整することがよくあります。R と ggplot を使えば、引数の値を変えるだけで図の見た目の変更が簡単に行えます。プログラミングによって図を作ることのメリットがここにあると言えます。

なお、上記の例では色や形のマッピングは自動で行いましたが、これを自分で指定することもできます。つまり、どの島に何色を割り当てるかや、どの種にどの形を割り当てるかを自分で詳しく指定することができます。その方法についてはggplot2によるデータの可視化のページで説明します。

なお、このページではグラフを表示する際に、いったん fig という変数にグラフデータを格納し、それを plot() 関数で表示するという手順をとっています。しかし、手っ取り早く図を確認したい場合であれば、変数を使わなくても以下のようなグラフ作成部分だけを Consle に打ち込んで実行すれば図を表示することができます。

ggplot(dat, aes(x = bill_length_mm, y = body_mass_g)) +
  geom_point(size = 2)

Console の入力欄で上キーを押せば最後に入力したコマンドが表示されるので、そこで size の値を書き換えて実行し、いい感じの見た目になるようなサイズの値を探ることができます。

7.2.5 棒グラフ (geom_bar, geom_col)

棒グラフは、カテゴリ(質的変数)ごとの量や値の大小を比較するのに適しています。ggplot2には、棒グラフを作成するgeomが2種類(geom_barとgeom_col)あり、目的によって使い分ける必要があります。

geom_bar(): データの件数を自動で集計する

geom_bar() は、指定されたカテゴリに属するデータの行数(件数)を自動的にカウントし、その結果を棒の高さにします。aes() では通常、X軸(またはY軸)のみを指定します。

例えば、species(種)ごとのペンギンの数を可視化する場合は、X軸に species を指定するだけです。

library(ggplot2)
library(palmerpenguins)
dat = palmerpenguins::penguins

fig = ggplot(dat, aes(x = species)) +
  geom_bar(fill = "#88b5d3")
plot(fig)

棒の色を指定する際はfillを使います(colorではないので注意)。色を指定する際に color を使うのか fill を使うのかは以下のような基準があります。

  • fill: 面(中身)の塗りつぶし色
  • color: 線や点、または図形の枠線の色

棒グラフの場合、fill と color の両方を指定することもできます。以下の例では白い棒に黒い枠線をつけています。

fig = ggplot(dat, aes(x = species)) +
  geom_bar(fill = "white", color = "black")
plot(fig)

棒の横幅を変えるには、geom_bar() の中でwidthを指定します。デフォルト値は0.9なので、少し細めにするために0.5を指定してみます。

library(ggplot2)
library(palmerpenguins)
dat = penguins

fig = ggplot(dat, aes(x = species)) +
  geom_bar(fill = "#88b5d3", width = 0.5)
plot(fig)

fill による積み上げと横並び

aes() で fill(塗りつぶし)を指定すると、カテゴリ内でさらに色分けすることができます。デフォルトでは棒はposition = "stack"(積み上げ)で表示されます。

fig = ggplot(dat, aes(x = species, fill = sex)) +
  geom_bar()
plot(fig)

積み上げではなく、横に並べて比較したい場合は、geom_bar() の中でposition = "dodge"を設定します。

fig = ggplot(dat, aes(x = species, fill = sex)) +
  geom_bar(position = "dodge")
plot(fig)

position の値はデフォルトではposition = "stack"と設定されている(stack は積み上げのこと)ので、position を何も指定しない場合は積み上げ棒グラフになっていたということです。

性別が欠損値であるデータが含まれているせいで、NAの棒が現れています。これが不要な場合は、データからNAの列を除外した上でグラフを作成するとよいでしょう。

dat2 = subset(dat, !is.na(sex))
fig = ggplot(dat2, aes(x = species, fill = sex)) +
  geom_bar(position = "dodge")
plot(fig)

7.3 グラフの体裁を整える(基本)

先のサクションでは geom を使って散布図や棒グラフを作成しました。デフォルト(初期設定)のままでもグラフは作成できますが、軸のラベルがRの変数名(例: bill_length_mm)のままだったり、背景が灰色だったりします。

このセクションでは、グラフを他の人に見せたり、レポートに使用したりするために最低限必要な、2つの基本的な体裁の整え方について解説します。

7.3.1 ラベルとタイトル (labs)

グラフにタイトルを追加したり、横軸や縦軸のラベルを指定するには、labs() 関数を使います。

labs() には title(タイトル)、x(X軸)、y(Y軸)などを指定します。また、aes() で color = island のように色をマッピングした場合、color 引数で凡例(はんれい)のタイトルも変更できます。

library(ggplot2)
library(palmerpenguins)
dat = palmerpenguins::penguins

fig = ggplot(dat, aes(x = bill_length_mm, y = body_mass_g, color = island)) +
  geom_point(alpha = 0.8) +
  labs(
    title = "Penguin Body Mass and Bill Length",
    x = "Bill Length (mm)",
    y = "Body Mass (g)",
    color = "Island"
  )

plot(fig)

上の例では labs() 関数の中でタイトル、X軸ラベル、Y軸ラベル、凡例タイトルの4つを指定していますが、これらすべてを必ず指定しなければならないわけではありません。Y軸ラベルだけを指定したい場合はlabs(y = "Body Mass (g)")とだけ書けば良いです。

7.3.2 デザインテーマの適用 (theme_*)

ggplot2 のデフォルトの背景は灰色ですが、これを theme_*() 関数で簡単に変更できます。

theme_*() は、グラフの背景色、グリッド線、枠線などのデザイン一式(テーマ)を瞬時に切り替えるための関数です。

labs() を追加した先ほどのグラフに、theme_bw()(“Black & White” の略)を適用してみましょう。これは、白背景とグレーのグリッド線を持つ、レポートや論文でよく使われるテーマです。

fig = ggplot(dat, aes(x = bill_length_mm, y = body_mass_g, color = island)) +
  geom_point(alpha = 0.8) +
  labs(
    title = "Penguin Body Mass and Bill Length",
    x = "Bill Length (mm)",
    y = "Body Mass (g)",
    color = "Island"
  ) +
  theme_bw()

plot(fig)

背景が白になるだけで、グラフ全体がすっきりとした印象になりました。

他にも theme_classic()(枠線と軸線のみ)や theme_minimal()(最小限の線)などがありますが、まずはこの theme_bw() を覚えておくと便利です。

詳細なデザイン(凡例の位置、文字サイズ、グリッド線の非表示など)の調整は theme() 関数で行いますが、それについては別の記事で解説します。

7.4 グラフの保存 (ggsave)

グラフを作成した後、plot(fig) によってRStudioの画面上でグラフを表示するだけでなく、レポートやプレゼンテーションで使用するために画像ファイルとしてグラフを保存する必要があります。

RStudioの Plots タブにある「Export」ボタンから手動で保存することもできますが、ggplot2 の ggsave() 関数を使うとファイル名・サイズ・解像度を指定できるため、作業の再現性(いつでも同じグラフを同じ設定で保存できること)が格段に上がります。

7.4.1 ggsave() の基本的な使い方

ggsave() は、ggplot() で作成したグラフをファイルに書き出す関数です。

ggsave() は非常に賢く、ファイル名の拡張子(.png、.pdf、.jpgなど)を見るだけで、自動的にファイル形式を判断して保存します。

まずは、前のセクションで作成した、体裁を整えたグラフを fig に格納します。

fig = ggplot(dat, aes(x = bill_length_mm, y = body_mass_g, color = island)) +
  geom_point(alpha = 0.8) +
  labs(
    title = "Penguin Body Mass and Bill Length",
    x = "Bill Length (mm)",
    y = "Body Mass (g)",
    color = "Island"
  ) +
  theme_bw()

ggsave(filename = "penguin_plot.png", plot = fig)

上記のプログラムを実行すると、Rの現在の作業ディレクトリ(getwd() コマンドで確認できます)に penguin_plot.png というファイルが作成されているはずです。

このようにして、グラフを画像(PNGファイル)として保存することができました。

7.4.2 サイズと解像度を指定して保存する

デフォルトでは、ggsave() は最後に表示したグラフのサイズを基準に保存しますが、画像の width(幅)、height(高さ)、dpi(解像度)を具体的に指定して保存することもできます。

  • width / height: 単位は units 引数で指定できますが、デフォルトはインチ (inches) です。
  • dpi: “dots per inch” の略で、画像の解像度を示します。Web用なら 72〜96、印刷用なら 300 が一般的です。
# 幅も高さも6インチ、解像度は 600 dpi の高解像度で保存
ggsave(
  filename = "penguin_plot_high_res.png",
  plot = fig,
  width = 6,
  height = 6,
  dpi = 600
)

上の例の場合、縦・横6インチの正方形の画像として保存しています(グラフの右に凡例があるので、グラフ自体は正方形にはなりませんが)。このように、大きさや dpi を指定することで画像を好きな比率・解像度で保存することができます。レポートや論文では高解像度の画像を掲載する必要がある場合があるので、この機能を使うことは重要です。

画像サイズをインチではなくピクセル数で指定したい場合は、units = "px"を引数に追加します。

# 幅 1600 ピクセル、高さ 1200 ピクセルで保存
ggsave(
  filename = "penguin_plot_high_res.png",
  plot = fig,
  width = 1600,
  height = 1200,
  units = "px"
)

もしunits = "px"を書いた上で dpi の値も同時に指定すると、ggsave() は指定されたピクセル数 (width と height) を確保しつつ、dpi の値も画像のメタデータとして設定しようとします。

7.4.3 PDF形式で保存する (ベクター形式)

filename の拡張子を.pdfに変えるだけで、ggsave() は自動的にPDF形式で保存します。

PDFはベクター形式と呼ばれ、画像をどれだけ拡大しても文字や線が荒くならない(ぼやけない)ため、論文やポスターなど、高画質が求められる印刷物に最適です。

# PDFとして保存
ggsave(filename = "penguin_plot.pdf", plot = fig, width = 6, height = 4)

7.5 おわりに

この記事では、ggplot2 の「図形の文法」という基本的な考え方から始め、data, aes, geom という3つの必須要素を使って散布図と棒グラフを作成しました。

さらに、labs() でラベルを整え、theme_bw() でデザインを変更し、ggsave() でグラフを保存する、というデータ可視化の基本的な流れを一通り学びました。

ggplot2 の基本はマスターできましたが、ggplot2 の真価は多様なグラフ表現と、グラフを細部までカスタマイズできる柔軟性にあります。

ggplot2によるデータの可視化のページではより幅広い ggplot2 の使用方法を解説します。

  • より多くの geom: 折れ線グラフ、ヒストグラム、箱ひげ図など
  • 詳細なカスタマイズ: scale_*() で特定の色や形を指定する方法
  • 高度なテクニック: theme() で凡例やグリッド線を個別に調整する方法
  • グラフの分割: facet_wrap() でカテゴリ別にグラフを並べる方法

それでは最後に、確認問題を通して今回のページの内容の理解を確かめましょう。

7.6 確認問題

7.6.1 ggplot2の基本要素

ggplot2 が「図形の文法」に基づき、グラフを構築するために必要とする3つの必須要素はどれでしょう?

  1. data (データ), labs (ラベル), theme (テーマ)
  2. data (データ), aes (マッピング), geom (ジオメトリ)
  3. aes (マッピング), geom (ジオメトリ), ggsave (保存)
  4. data (データ), geom (ジオメトリ), fill (塗りつぶし)
解答

答えは 2. data (データ), aes (マッピング), geom (ジオメトリ) です。

[解説] ggplot2 でグラフを描画するには、ggplot() 関数に「どの data を使うか」を指定し、aes() で「どの変数をどの見た目(軸、色など)に マッピング するか」を指定し、+ で「どの geom(点、棒など)で描画するか」を指定する必要があります。labs や theme は、グラフを整えるための追加のレイヤーです。

7.6.2 マッピングと設定の違い

geom_point() を使って、散布図の「すべての点の色をデータに関係なく赤色("red")に固定」したい場合、Rコードはどのように記述すべきですか?

  1. ggplot(dat, aes(x = ..., y = ..., color = "red")) + geom_point()
  2. ggplot(dat, aes(x = ..., y = ..., color = red)) + geom_point()
  3. ggplot(dat, aes(x = ..., y = ...)) + geom_point(color = "red")
  4. ggplot(dat, aes(x = ..., y = ...)) + geom_point(aes(color = "red"))
解答

答えは 3.ggplot(dat, aes(x = ..., y = ...)) + geom_point(color = "red")です。

  • 色をデータに連動させる(マッピングする)場合は aes() の中に記述します (例:aes(color = species))。
  • 色をデータに関係なく固定する(設定する)場合は、aes() の外(geom_…() の引数)に記述します (例: geom_point(color = "red"))。
  • 選択肢1や4のように aes() の中に固定値 "red" を入れると、「"red" という名前のカテゴリ」として扱われ、意図した赤色にはなりません。

7.6.3 件数の棒グラフ

本文で使用した penguins データを使い、island(島)ごとのペンギンの件数を示す棒グラフ(geom_bar)を作成してください。

解答
library(ggplot2)
library(palmerpenguins)
dat = palmerpenguins::penguins

# グラフ作成
fig = ggplot(dat, aes(x = island)) + geom_bar()

# グラフ表示
plot(fig)

[解説] geom_bar() は、指定された aes(x = island) に基づき、dat データフレームから island ごとの行数(件数)を自動的にカウントして棒グラフを作成します。Y軸を指定する必要はありません。

7.6.4 積み上げ棒グラフ

penguins データを使い、species(種)ごとのペンギン数を集計する棒グラフ(geom_bar)を作成してください。その際、aes() を使って、それぞれの棒グラフを island(島)別に色分けした積み上げ棒グラフにしてください。

解答
fig = ggplot(dat, aes(x = species, fill = island)) +
  geom_bar()

plot(fig)

[解説] geom_bar() は x 軸に指定された species で自動的に件数を集計します。ここで aes() の中にfill = islandを追加で指定すると、species の各カテゴリの「内訳」として island ごとの件数を計算し、自動的に積み上げ棒グラフ(position = "stack"がデフォルト)として色分けします。

7.6.5 平均値の棒グラフ

penguins データを使って、species(種)ごとの flipper_length_mm(足ひれの長さ)の平均値を示す棒グラフ(geom_col)を作成してください。

解答
# 1. species ごとの平均フリッパー長を計算
df = aggregate(flipper_length_mm ~ species, data = dat, FUN = mean, na.rm = TRUE)

# 2. geom_col() でプロット
fig = ggplot(df, aes(x = species, y = flipper_length_mm)) +
  geom_col()

plot(fig)

[解説] 件数ではなく平均値を表示する場合、geom_bar() ではなく geom_col() を使います。geom_col() は自動で集計を行わないため、事前に集計データを自分で作成する必要があります。 ggplot() には集計データの df を渡し、aes() でX軸(カテゴリ)とY軸(平均値)の両方を指定します。

7.6.6 ggsave() のサイズ指定

fig という変数に格納されたグラフを、"chart.png" というファイル名で、幅 8 インチ、高さ 5 インチで保存するRコードを記述してください。

解答
# fig は作成済みと仮定
ggsave(filename = "chart.png", plot = fig, width = 8, height = 5)

[解説] ggsave() は、filename(ファイル名)と plot(グラフ変数)の他に、width(幅)と height(高さ)の引数を取ることができます。単位はデフォルトでインチです。dpi (解像度) を指定しなかった場合、デフォルト値である300が使用されます。

7.6.7 総合問題

penguins データを使い、以下のすべての条件を満たすグラフを作成してください。

  1. geom_point() を使った散布図である。
  2. X軸に flipper_length_mm(フリッパーの長さ)、Y軸に bill_length_mm(クチバシの長さ)をマッピングする。
  3. species(種)に応じて色をマッピングする。
  4. グラフのタイトルを "Flipper Length and Bill Length" にする。
  5. X軸のラベルを "Flipper Length (mm)" にする。
  6. Y軸のラベルを "Bill Length (mm)" にする。
  7. 凡例のタイトルを "Species" にする。
  8. グラフのテーマを theme_bw() に変更する。
  9. 作成したグラフを fig という変数に格納し、"penguin_scatter.png" というファイル名で保存する。
解答
fig = ggplot(dat, aes(x = flipper_length_mm, y = bill_length_mm, color = species)) +
  geom_point() +
  labs(
    title = "Flipper Length and Bill Length",
    x = "Flipper Length (mm)",
    y = "Bill Length (mm)",
    color = "Species"
  ) +
  theme_bw()

ggsave(filename = "penguin_scatter.png", plot = fig)

[解説] ggplot() と aes() でグラフの基本構造(条件1, 2, 3)を定義します。 labs() を使って、タイトル、X軸、Y軸、凡例のラベル(条件4, 5, 6, 7)を一度に設定します。 theme_bw() を + で追加し、デザインテーマ(条件8)を変更します。 最後に、ggsave() を使って、plot = fig と filename を指定し、ファイルとして保存します(条件9)。