RとQuartoではじめるデータサイエンス

#5 可視化(2)

苅谷千尋

金沢大学

May 13, 2026

0. 本日の目標

本日の目標

  1. レポート課題(特に内容と締め切り)を理解する
  2. チャンクオプションを試してみる
  3. データの特徴に見合った配色変更する
  4. データの特徴に見合ったラベル変更する

Ⅰ. レポート課題

レポート課題

2. 提出先と締め切り

  • 提出先dropbox
  • 締め切り:2026年6月3日(水)10時30分まで
    • 最終授業日の開始直前
  • ファイル: zipファイル
    • ファイル名のどこかに、氏名を特定できる文字を入れて下さい
  • 再提出:
    • 再提出する場合は6月5日(金)23:59分までに再提出して下さい(必須ではありません。提出先は同じ)。最終版のファイルで成績を評価します

レポート課題

4. 内容

  1. タイトルと見出し
  2. 分析の対象と分析の目的
  3. 図(最低3つ)とそれぞれの簡単な(2〜3行程度)説明
  4. 結論:作図を通して何が明らかになったのか(3〜5行程度)
  5. 出典
    • データの出典
    • この他に使用した文献などがあれば、それも記載すること
    • ただし、Rやggplotの使い方、作成に関する出典は記載しない

Ⅱ. 前回の振り返り

授業の感想

ヒストグラムを作る際に“species”をgroup_byでグループ分けをしましたが、演習6で箱ひげ図を作る際にgroup_byが不要なことに気づき、どういうときにgroup_byの処理をする必要があるのか分からなくなってきました(寺西さん)

前回の授業の補足

  • 統計センターからの返答
  • Rに適したファイルの公開を予定している

前回の積み残し

Ⅲ. ggplotの「日本語問題」

ggplotの「日本語問題」(通称:豆腐)

現象と原因

  • グラフ中の日本語が □(四角)で表示される
    • 軸ラベル(x, y);凡例(legend);タイトル;geom_text()
    • 見た目が「豆腐」に見えるため「豆腐現象」と呼ばれる
  • ggplotのデフォルトフォントが日本語の文字を持っていないために生じる

対応方法

  • ggplotのコード内(通常、最終行)で、日本語フォントを指定する
  • Windows
theme(text = element_text(family = "Meiryo"))
  • mac
theme(text = element_text(family = "Hiragino Sans"))

ggplotの「日本語問題」(通称:豆腐)

  • すべての図ごとにフォント指定をするのは面倒なので、Setup Chunkで一括設定する
  • Setup Chunkのlibrary()の次に、以下のコードを貼り付けて下さい
    • 以下のコードは日本語表示だけでなく、theme、軸、凡例も一括設定している
    • グラフごとに設定すると、コードがぐちゃぐちゃになりやすく、また、ファイル内で見た目の統一が図れない
# ggplot theme_classicのフォント設定 ----
ggplot2::theme_set(
  theme_classic(base_family = "Meiryo") +
    theme_sub_axis_bottom(
      title = element_text(size = 7, margin = margin(t = 8)),
      text  = element_text(size = 6.5)
    ) +
    theme_sub_axis_left(
      title = element_text(size = 7, margin = margin(r = 8)),
      text  = element_text(size = 7, hjust = 0)
    ) +
    theme_sub_legend(
      position   = "bottom",
      margin     = margin(t = -6),
      key.size   = unit(4, "mm")
    )
)
# ggplot theme_classicのフォント設定 ----
ggplot2::theme_set(
  theme_classic(base_family = "Hiragino Sans") +
    theme_sub_axis_bottom(
      title = element_text(size = 7, margin = margin(t = 8)),
      text  = element_text(size = 6.5)
    ) +
    theme_sub_axis_left(
      title = element_text(size = 7, margin = margin(r = 8)),
      text  = element_text(size = 7, hjust = 0)
    ) +
    theme_sub_legend(
      position   = "bottom",
      margin     = margin(t = -6),
      key.size   = unit(4, "mm")
    )
)

Ⅳ. チャンクオプション

チャンクオプション

  • 各R chunkの冒頭に書く

コードの実行関係

  • echo: コードを表示するか(デフォルトはtrue = 表示する)
  • output: 実行結果を表示するか(デフォルトはtrue = 表示する)
  • eval: コードを実行するか(デフォルトはtrue = 実行する)

図の表示関係

  • fig-width: 数字を大きくすると横に広がる(インチ)
  • fig-height: 数字を大きくすると縦に長くなる(インチ)
  • fig-asp: アスペクト比(1が正方形)
  • fig-align: 図の位置の変更(left; right; center)

チャンクオプション

  • ただし、echoとoutputは、YAMLでグローバル設定するのが普通(後述)

チャンクオプション

#| echo: false
#| output: true
#| fig-width: 8
#| fig-asp: 0.5
#| fig-align: center

チャンクオプション

チャンクオプション

evalの使用目的

  • 実行できない(エラーが起こる)チャンクの実行回避
  • 実行したくないチャンクの実行回避
  • 実行に時間がかかるチャンクの実行回避
  • サンプルコードだけ見せたい

チャンクオプション

evalの使い方

  • 補完入力されない

  • 補完入力される

YAML設定

YAMLでのチャンクオプションの設定

  • 個別チャンクに書かなくても、quartoファイル全体のデフォルトを設定できる

設定

  • execute: コード実行に関する設定
  • freeze: auto:変更がない場合、前回の実行結果を再利用
  • echo: false:コードを表示しない
  • warning: false:警告を表示しない

YAML設定

  • YAMLの最後の方に以下のコードを入れましょう
execute:
  freeze: auto
  echo: false
  warning: false

Ⅴ. 図の見た目・体裁

theme

ggplot公式theme

  • theme_gray():デフォルト
  • theme_bw():白黒(論文向け)
  • theme_classic():軸だけ(推奨
  • theme_minimal():最小限(プレゼン向け)
  • theme_void():何もなし

追加theme

  • ggthemes
    • パッケージのインストールと読み込みが必要
# theme_set(
#   theme_few(base_family = "Meiryo")
# )

カラーパレット

カラーパレットは、プロットに用いるデータを表現する能力に基づいて選ぶのがよいでしょう。例えば国や性別など、順序なしのカテゴリカル変数を表すには、簡単に混同されないような、はっきり区別できる色が必要です。その一方で、教育レベルといったような順序付きカテゴリカル変数では、大小や早い遅いなど段階的に変化する色の枠組みが必要です。それ以外にも変数の種類があります。例えば、順序付き変数でも、リッカート尺度 (Likert scale)のように中間的な点から双方向に広がるにつれて離れていくような尺度を取り扱う場合はどうすればよいでしょうか。繰り返しになりますが、この質問は色の尺度で変数をマッピングする場合にどうやって正確さや忠実さを確保するのかという問題です。手元のデータの構造を反映したパレットを選ぶように注意してください。例えば、連続的な変化をカテゴリカルなパレットでマッピングしないように、また、双方向パレットを使う場合は中間点がはっきりしない変数には用いないようにしましょう(ヒーリー,キーラン (2021), 283ページ)。

色の変更:ggplotのパレット

fill

penguins |> 
  drop_na(body_mass, sex) |> 
  filter(species == "Adelie") |> 
  ggplot(aes(x = body_mass, fill = sex)) +
  geom_histogram(binwidth = 300) +
  scale_fill_brewer(palette = "Set1")

colour

penguins |>
  count(year, species) |>
  ggplot(aes(x = year, y = n, colour = species)) +
  geom_line() +
  scale_colour_brewer(palette = "Set1")

色の変更:マニュアル指定

  • カラー名の他、HTMLカラーコードも使用可
penguins |> 
  drop_na(body_mass, sex) |> 
  filter(species == "Adelie") |> 
  ggplot(aes(x = body_mass, fill = sex)) +
  geom_histogram(binwidth = 300) +
  scale_fill_manual(
    values = c(
      "female" = "pink",
      "male"   = "lightblue"
    )
  )

penguins |> 
  drop_na(body_mass, sex) |> 
  filter(species == "Adelie") |> 
  ggplot(aes(x = body_mass, fill = sex)) +
  geom_histogram(binwidth = 300) +
  scale_fill_manual(
    values = c(
      "female" = "#E69F00",
      "male"   = "#56B4E9"
    )
  )

色の変更:追加パッケージ

  • 色指定の関数はパッケージごとに異なる
  • パッケージのインストールと読み込みが必要
penguins |>
  drop_na(species, sex, body_mass) |> 
  group_by(species, sex) |>
  summarise(avg_body_mass = mean(body_mass), .groups = "drop") |>
  ggplot(aes(x = species, y = avg_body_mass, fill = species)) +
  geom_col() + 
  facet_wrap(~ sex) +
  scale_fill_paletteer_d("DresdenColor::briefcases") # "ダブルクォテーション内がパレット名"

色の変更:追加パッケージ

  • 色指定の関数はパッケージごとに異なる
  • パッケージのインストールと読み込みが必要
penguins |>
  drop_na(species, sex, body_mass) |> 
  group_by(species, sex) |>
  summarise(avg_body_mass = mean(body_mass), .groups = "drop") |>
  ggplot(aes(x = species, y = avg_body_mass, fill = species)) +
  geom_col() + 
  facet_wrap(~ sex) +
  scale_fill_manual(values = met.brewer("Klimt", 3)) # "ダブルクォテーション内がパレット名"

色の変更:追加パッケージ

  • 色指定の関数はパッケージごとに異なる
  • パッケージのインストールと読み込みが必要
penguins |>
  drop_na(species, sex, body_mass) |> 
  group_by(species, sex) |>
  summarise(avg_body_mass = mean(body_mass), .groups = "drop") |>
  ggplot(aes(x = species, y = avg_body_mass, fill = species)) +
  geom_col() + 
  facet_wrap(~ sex) +
  scale_fill_lancet() # 学術誌lancetのカラーに

色の透過度

  • 透過度はgeom_()内のalphaで指定
    • 0: 完全に透明(見えない)/ 1: 完全に不透明(普通の色・デフォルト値)
penguins |> 
  drop_na(body_mass, sex) |> 
  filter(species == "Adelie") |> 
  ggplot(aes(x = body_mass, fill = sex)) +
  geom_histogram(binwidth = 300, alpha = 0.5) +
  scale_fill_manual(
    values = c(
      "female" = "#E69F00",
      "male"   = "#56B4E9"
    )
  )

データによる色分けではない色の変更

  • データと関係ない固定色の指定
    • fillでもcolourでもない色を変えたい
  • 方法:aesの外で指定する
    • geom_()内のfillで指定
    • Cf. aes() の中:データに応じて変わる
penguins |> 
  drop_na(species) |> 
  ggplot(aes(x = species)) +
  geom_bar(fill = "#C5DFF4FF")

軸ラベル

label_comma()関数

  • 軸の値に,を足す
    • 例:100000→100,000
penguins |> 
  drop_na(species, body_mass) |>
  group_by(species) |> 
  summarise(avg_body_mass = round(mean(body_mass), 1)) |>
  ggplot(aes(x = species, y = avg_body_mass)) +
  geom_col() +
  geom_text(aes(label = avg_body_mass, 
                vjust = -0.5)) +
  scale_y_continuous(labels = scales::label_comma())

軸ラベル

label_percent()関数

  • 数値をパーセント形式に変換する関数

scale_x_continuous()関数 / scale_y_continuous()関数

  • 軸の設定を変更する関数
    • continuous は「連続値」という意味
penguins |> 
  drop_na(species, island) |> 
  count(island, species) |> 
  group_by(island) |> 
  mutate(prop = n / sum(n)) |> 
  ggplot( aes(x = island, y = prop, fill = species)) +
  geom_col(position = "fill") +
  scale_y_continuous(labels = scales::label_percent()) # y軸を比率表示に変更

軸ラベル

label_kansuji()関数

  • 日本語表記の桁数
    • 例:100,000→10万
    • zipangu
      • 日本語表記(年号・住所への対応)などに対応するパッケージ

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

df_pop_all |> 
  mutate(都道府県 = factor(都道府県, levels = pref_levels)) |> 
  ggplot(aes(x = 都道府県, y = 推定人口)) +
  geom_col(fill = "#D55E00") +
  gghighlight(都道府県 == "石川県") +
  scale_y_continuous(labels = zipangu::label_kansuji()) + # y軸のラベルを日本語にして視認性を高める
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # x軸のラベルの角度を調整

軸ラベル・凡例ラベル

labs()関数

  • 図に表示される説明的な文字を設定(変更)する関数
    • x軸・y軸のラベル(x; y)
    • 凡例のラベル(fill; colour)
    • ““にするとラベルなどになる
labs(
  title = "",
  subtitle = "",
  caption = "",
  x = "",
  y = "",
  colour = "",
  fill = "",
  shape = "",
  size = ""
)

軸ラベル・凡例ラベル

fill

penguins |> 
  ggplot(aes(bill_len, fill = island)) +
  geom_histogram() +
  labs(
    title = "ペンギンのくちばしの長さ",
    subtitle = "島ごとの比較",
    x = "くちばしの長さ(mm)",
    y = "個体数",
    fill = "島", # 凡例の名前
    caption = "Source: palmerpenguins"
  )

軸ラベル・凡例ラベル

colour

penguins |> 
  ggplot(aes(bill_len, body_mass, colour = island)) +
  geom_point() +
  labs(
    title = "ペンギンの体重",
    subtitle = "Palmer Penguins データセット",
    colour = "島", # 凡例の名前
    caption = "Source: palmerpenguins"
  )

ハイライト

  • 注目してほしい部分だけを浮かび上がらせる

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

penguins |> 
  drop_na(body_mass, flipper_len) |> 
  ggplot(aes(x = flipper_len, y = body_mass)) +
  geom_point(color = "#D55E00") + # デフォルトだと色分けがわかりづらいので、追加指定
  gghighlight(body_mass > 4500) # body_massが4500より大きい値だけをハイライト

Ⅵ. テキストラベル

テキストラベル

geom_text()関数

  • 棒の上に「数」を表示する:生データ(集計前データ)の場合
penguins |> 
  drop_na(species) |> 
  ggplot(aes(x = species)) +
  geom_bar() +
  geom_text(
    stat = "count", # 集計済みデータではないので、数値を算出する必要がある
    aes(label = after_stat(count)),
    vjust = -0.5 # 位置を調整
  )

テキストラベル

geom_text()関数

  • 棒の上に「数」を表示する:集計後データの場合
penguins |> 
  drop_na(species, body_mass) |>
  group_by(species) |> 
  summarise(avg_body_mass = round(mean(body_mass), 1)) |>
  ggplot(aes(x = species, y = avg_body_mass)) +
  geom_col() +
  geom_text(aes(label = avg_body_mass, # 平均値は算出済みなので、ラベルを指示するだけでいい
                vjust = -0.5)) # 位置を調整

帯グラフ

  • 棒の上に「数」を表示する:集計後データの場合②比率と実数
penguins |> 
  drop_na(species, island) |> 
  count(island, species) |> 
  group_by(island) |> 
  mutate(prop = n / sum(n)) |> 
  ggplot( aes(x = island, y = prop, fill = species)) +
  geom_col(position = "fill") +
  geom_text(
    aes(
      label = str_c( # 複数の要素を文字列として結合する
        scales::percent(prop), # 比率(%が付される)
        "\n(n=", n, ")" # 実数
      )
    ),
    position = position_fill(vjust = 0.5), # 位置
    size = 3 # 文字サイズ
  ) +
  scale_y_continuous(labels = scales::label_percent()) + # y軸を比率表示に変更
  labs(y = "proportion") # y軸のラベルを変える(%が付されているので、proportionを削って""だけにしてよい=y軸のラベルがなくなる)

Ⅶ. 次回の授業と宿題

次回の授業と宿題

次回:5月20日(水)

出力

  1. 図の書き出し
  2. 出力形態の変更
  3. CSS

次回の授業と宿題

宿題

  • 授業の感想:
    • 回答先:Google Forms
    • 締め切り:5月15日(金)23時59分

演習:

  • 内容:演習⑨
  • ファイル:演習の該当箇所を抜き出すのではなく、qmdファイルをそのまま提出
    • ファイル名:どこかに氏名を特定できる文字を入れて下さい
    • 例:inClassExercise_kariya.qmd
  • 提出先:dropbox
  • 締め切り:5月18日(月)23時59分

引用文献

ヒーリー,キーラン, 2021. データ分析のためのデータ可視化入門, 瓜生真也・江口哲史・三村喬生 訳. 講談社.