organdata |>
ggplot(aes(x = roads, y = donors)) +
geom_point() +
annotate(
geom = "text", # 注釈の形態にテキストを指定
x = 91, y = 33, # 注釈を挿入する座標軸を指定
label = "A surpriseingly high \n recovery rate", # 注釈の文字
hjust = 0 # テキストの水平位置を調整。0の場合、テキストの左端が指定されたx座標に揃えられる
)
Ⅰ. 前回の振り返り
1. 前回の「授業の感想」
- 別紙参照
2. 前回の補足
- base Rのアップデート(4.5.0)に続き、R Studioもアップデートされました。こちらも、自動アップデート機能はないので、最新版のインストールファイルを再度、インストールすることでアップデートできます
- コンソールに表示されるメッセージが色分けされ、わかりやすくなりました!(What’s New)。ミス防止につながるアップデートなので、時間のあるときにアップデートしておきましょう
Ⅱ. データの整形・ラベル・メモの追加 part II
1. 図内への描画と書き込み
教科書5.5(189ページから)
図に注釈を加える:annotate()関数
- socvizパッケージのインストールと読み込み(まだの場合)
organdata |>
ggplot(aes(x = roads, y = donors)) +
geom_point() +
annotate(
geom = "rect", # 注釈の形態にrectangle(矩形)を指定
xmin = 125, xmax = 155, # 矩形の左端と右端
ymin = 30, ymax= 35, # 矩形の下端と上端
fill = "red", # 矩形の色を指定
alpha = 0.2 # 色の透過度を指定(デフォルト値1では見にくくなるため)
) +
annotate(
geom = "text",
x = 157, y = 33,
label = "A surpriseingly high \n recovery rate",
hjust = 0
)
annotate()関数は凡例を加えられません。geom_rect()関数は凡例を加えることが可能です。方法は以下の通りです
以下のデータフレームに興味がある場合は、サンプル:金沢広域急病センター利用者数を参照下さい
# 矩形のデータフレームを作成
rects <- data.frame(
xmin = as.Date("2020-04-16"),
xmax = as.Date("2021-09-30"),
ymin = -Inf,
ymax = Inf,
label = "緊急事態宣言" # 凡例に表示するラベル
)
df_hospital_long |>
arrange(日付) |>
group_by(専門) |>
mutate(移動平均 = rollmean(利用者数, k = 90, fill = NA, align = "right")) |>
ggplot(aes(x = 日付, y = 移動平均, color = 専門, group = 専門)) +
geom_line() +
geom_rect(data = rects, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = label), alpha = 0.05,inherit.aes = FALSE) +
scale_fill_manual(values = "red", name = "") +
theme_minimal(
base_family = "HiraginoSans-W3"
)
さらに学習したい場合は、役立つサイト>アノテーションを参照下さい
2. scale_関数・guides()関数・labs()関数
教科書5.6(191ページから)
- scales_関数はggplot2に入っていません。別途、scalesパッケージをインストール、library関数で読み込んで下さい
⑴ 目盛りの調整:scale_関数
organdata |>
filter(!if_any(everything(), is.na)) |>
ggplot(aes(x = roads, y = donors, color = world)) +
geom_point() +
scale_x_log10() # X軸を線形軸から対数軸に
organdata |>
filter(!if_any(everything(), is.na)) |>
ggplot(aes(x = roads, y = donors, color = world)) +
geom_point() +
scale_x_log10() + # X軸を線形軸から対数軸に
scale_y_continuous(breaks = c(5, 15, 25)) # 間隔を直接指定する
以下のscale_y_continuousの指定は、教科書にはないコードだが、一番、使い勝手がいいと思う
organdata |>
filter(!if_any(everything(), is.na)) |>
ggplot(aes(x = roads, y = donors, color = world)) +
geom_point() +
scale_x_log10() +# X軸を線形軸から対数軸に
scale_y_continuous(breaks = seq(0, 30, by = 10)) # 最小値、最大値、目盛りの単位を指定
organdata |>
filter(!if_any(everything(), is.na)) |>
ggplot(aes(x = roads, y = donors, color = world)) +
geom_point() +
scale_x_log10() + # X軸を線形軸から対数軸に
scale_y_continuous(
n.breaks = 10) # y軸の目盛りを10にする(ggplot2が自動的に目盛りの位置を調整するのを助ける)
organdata |>
filter(!if_any(everything(), is.na)) |>
ggplot(aes(x = roads, y = donors, color = world)) +
geom_point() +
scale_x_log10() + # X軸を線形軸から対数軸に
scale_y_continuous(breaks = c(5, 15, 25),
labels = c("Five", "Fifteen", "Twenty Five") # ラベルを上書き
)
- 桁にカンマを入れる
ggplot(data.frame(x = 1:10, y = (1:10) * 1000), aes(x, y)) +
geom_col() +
scale_y_continuous(labels = label_comma())
⑵ 凡例:guides()関数
- ggplotやgeom_でcolorを指定している場合:
- scale_color_discrete、labsもcolor
- ggplotやgeom_でfillを指定している場合:
- scale_fill_discrete、labsもfillに
organdata |>
filter(!if_any(everything(), is.na)) |>
ggplot(aes(x = roads, y = donors, color = world)) +
geom_point() +
guides(color = guide_legend(title = "政治体制")) # 凡例のタイトルを変える
organdata |>
filter(!if_any(everything(), is.na)) |>
ggplot(aes(x = roads, y = donors, color = world)) +
geom_point() +
guides(color = "none") # 凡例を削除(自明の場合に有効)
organdata |>
filter(!if_any(everything(), is.na)) |>
ggplot(aes(x = roads, y = donors, color = world)) +
geom_point() +
guides(color = guide_legend(reverse = TRUE)) # 凡例内の順序を逆にしたい場合
⑶ ラベル:labs()関数
organdata |>
filter(!if_any(everything(), is.na)) |>
ggplot(aes(x = roads, y = donors, color = world)) +
geom_point() +
scale_color_discrete(
labels = c("コーポラティスト", "リベラル", "社会民主主義", "未分類")
) + # 凡例内のラベルを書き換える
labs(x = "交通事故死者数", # 凡例(X軸)
y = "臓器提供数", # 凡例(Y軸)
color = "福祉国家体制") # 凡例(色分け)
⑷ 図の見た目:theme()関数
- 図の見た目(非データ要素)を細かくカスタマイズするために使います
- ggplotに入っているので、追加パッケージは不要
organdata |>
filter(!if_any(everything(), is.na)) |>
ggplot(aes(x = roads, y = donors, color = world)) +
geom_point() +
theme(legend.position = "bottom") # 凡例を下に置きたい
palmerpenguins::penguins |>
ggplot(aes(x = species, fill = island)) +
geom_bar(position = "dodge") +
labs(title = "島ごとのペンギンの種類の分布",
x = "ペンギンの種類",
y = "個体数") +
theme(
axis.text.x = element_text(angle = 45, hjust = 1) # x軸の値のラベルの傾きを調整(angleやhjustで微調整可能)
)
上の図ではあまり意味をもちませんが、長いラベルの場合に必須です
palmerpenguins::penguins |>
ggplot(aes(x = species, fill = island)) +
geom_bar(position = "dodge") +
labs(title = "島ごとのペンギンの種類の分布",
x = "ペンギンの種類",
y = "個体数") +
theme(
plot.title = element_text(hjust = 0.5) # タイトルを中央に
)
⑸ 組み込みのggplot2テーマ
organdata |>
filter(!if_any(everything(), is.na)) |>
ggplot(aes(x = roads, y = donors, color = world)) +
geom_point() +
scale_color_discrete(
labels = c("コーポラティスト", "リベラル", "社会民主主義", "未分類")
) + # 凡例内のラベルを書き換える
labs(x = "交通事故死者数", # 凡例(X軸)
y = "臓器提供数", # 凡例(Y軸)
color = "福祉国家体制") + # 凡例(色分け)
theme(legend.position = "bottom") + # 凡例を下にしたい
theme_minimal( #シンプルな見た目にする
base_family = "HiraginoSans-W3" # フォントを直接指定しないと豆腐(□)になる。Windowsユーザーは"Meiryo"を指定して下さい
)
- 他のテーマセットについてはggplot2のテーマはどれを使うべきかを参照
Ⅲ. プロットを整える
1. 色を使いこなす
色は好き嫌いで選んではいけません。数字の特性、意味を考えることが重要です。
ggplotでは視覚障害者への配慮が歓迎されています。dichromatパッケージ(教科書285ページ参照)やcolorblindrパッケージが有名です。
カラーパレットは、プロットに用いるデータを表現する能力 に基づいて選ぶのがよいでしょう。例えば国や性別など、順序なしのカテゴリカル変数を表すには、簡単に混同されないよ うな、はっきり区別できる色が必要です。その一方で、教育レベルといったような順序付きカテゴリカル変数では、大小や早い遅いなど段階的に変化する色の枠組みが必要です。それ以外にも変数の種類があります。例えば、順序付き変数でも、リッ カート尺度 (Likert scale)のように中間的な点から双方向に広がるにつれて離れていくような尺度を取り扱う場合はどうすればよいでしょうか。繰り返しになりますが、この質問は色の尺度で変数をマッピングする場合にどうやって正確さや忠実さを確保するのかという問題です。手元のデータの構造を反映したパレットを選ぶように注意してください。例えば、連続的な変化をカテゴリカルなパレットでマッピングしないように、また、双方向パレットを使う場合は中間点がはっきりしない変数には用いないようにしましょう(ヒーリー,キーラン (2021), 283ページ)。
organdata |>
filter(!if_any(everything(), is.na)) |>
ggplot(aes(x = roads, y = donors, color = world)) +
geom_point() +
scale_color_brewer(palette = "Set2")
organdata |>
filter(!if_any(everything(), is.na)) |>
ggplot(aes(x = roads, y = donors, color = world)) +
geom_point() +
scale_color_brewer(palette = "Pastel2")
organdata |>
filter(!if_any(everything(), is.na)) |>
ggplot(aes(x = roads, y = donors, color = world)) +
geom_point() +
scale_color_brewer(palette = "Dark2")
scale_color_brewerはドットやラインに対して使います。色をうめる場合はscale_fill_brewerを使います
palmerpenguins::penguins |>
filter(!if_any(everything(), is.na)) |>
ggplot(aes(x = bill_length_mm, fill = species)) +
geom_histogram() +
scale_fill_brewer(palette = "Dark2")
R4.5.0でpenguinsのデータセットがbase Rに入りましたが、レンダリングがうまくいかないので、palmerpenguinsのパッケージを使っています。「palmerpenguins::penguins」のような::表記は、関数名が衝突する場合(この場合、base Rとpalmerpenguinsパッケージが、同じpenguinという関数を使っているので、衝突します。base Rが優先されます)、パッケージを指定するために使います
2. 連続変数と離散変数に合った色
- RColorBrewerをインストールし、ライブラリで読み込む
頻繁に使いたい場合はセットアップチャンクに、一時的に試したいだけの場合は、以下のように通常のチャンクで読み込んで下さい
⑴ 連続変数
library("RColorBrewer")
display.brewer.all(type="seq")
⑵ 離散変数
library("RColorBrewer")
display.brewer.all(type="div")
library("RColorBrewer")
display.brewer.all(colorblindFriendly = TRUE)
- 上記を確認の上、パレットに「Paired」を選択
organdata |>
filter(!if_any(everything(), is.na)) |>
ggplot(aes(x = roads, y = donors, color = world)) +
geom_point() +
scale_color_brewer(palette = "Paired")
ggplotが必要とする色の数に対して、パレットがもつ色の数が足りない場合、エラーが出ますので注意して下さい
より多くの配色を探す場合は、R Color Palettesが有益です。
- paletteerをインストールし、セットアップチャンクに読み込む
organdata |>
filter(!if_any(everything(), is.na)) |>
ggplot(aes(x = roads, y = donors, color = world)) +
geom_point() +
scale_color_paletteer_d("DresdenColor::briefcases") # paletteer関数の使い方
いろいろなテーマがあります。詳しくは役立つサイト>テーマを参照下さい
Ⅳ. 横持ちデータと縦持ちデータ
- 横持ちデータと縦持ちデータについては、第2回目の授業で簡単に紹介しました(リンク)
- 今回は、変換の具体的な方法を説明します
0. 準備
-
Google Drive「w6」から以下のファイルをダウンロード
- 候補者別得票数_開票区別.csv
- 各自の「data」フォルダに収納
- read_csv()関数でデータを読み込み、オブジェクトに入れる(困ったら、第3回目のウェブページを参照しましょう)
- データを確認しましょう(head()関数など)
- 以下のコードを参考に、縦持ちデータを横持ちデータに変換しましょう
df_東京都知事選挙_候補者別得票数 <-
read_csv("data/候補者別得票数_開票区別.csv")
df_東京都知事選挙_候補者別得票数 |> head()
# A tibble: 6 × 13
選挙 年 開票区名 小池ゆりこ 石丸伸二 安野たかひろ 清水国明 AIメイヤー
<chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 都知事選 2024 千代田区 13490 8818. 1623 173 17
2 都知事選 2024 中央区 36927 24890. 4067 413 41
3 都知事選 2024 港区 43787 30863. 4715 481 42
4 都知事選 2024 新宿区 63036 39072. 5242 775 58
5 都知事選 2024 文京区 49077 28010. 5874 632 41
6 都知事選 2024 台東区 42228 27357. 3277 554 65
# ℹ 5 more variables: 田母神としお <dbl>, 蓮舫 <dbl>, 内藤愛里 <dbl>,
# ひまそらあかね <dbl>, アキノリ将軍未満 <dbl>
候補者別にカラムがあり、ggplotで操作しにくい=候補者というカラムがあった方がggplotで操作しやすい
1. 縦持ちデータへの変換
df_東京都知事選挙_候補者別得票数_long <-
df_東京都知事選挙_候補者別得票数 |>
pivot_longer(
cols = 4:13, # 対象とする列を指定(すべて候補者)
names_to = "候補者名", # 縦持ちデータに変換した場合の列名
values_to = "投票者数" # 縦持ちデータに変換した場合の値の列名
)
縦持ちデータへの変換については、初回アンケート集計やサンプル:金沢広域急病センター利用者数も参照下さい。この変換方法については、ChatGPTはおおむね、正しい返答をしてくれるので、お試し下さい。
2. 縦持ちデータを使った図の作成
⑴ 棒グラフ
df_東京都知事選挙_候補者別得票数_long |>
filter(年 == 2024) |> # 2024年の選挙結果に限定
group_by(候補者名) |> # 開票区別のデータから候補者別の集計に加工する
summarise(投票者数 = sum(投票者数, na.rm = TRUE)) |>
mutate(
`得票数(千人)` = 投票者数/1000
) |>
ggplot(aes(x = `得票数(千人)`, y = reorder(候補者名, `得票数(千人)`)) # 得票数の高い順に並べ替える
) +
geom_bar(stat = "identity",
position = "dodge") +
scale_x_continuous(labels = comma) + # 3桁ごとにカンマを挿入
labs(
y = "",
x = "得票数(単位:千人)"
) +
geom_vline(xintercept = 1000,
color = "red") # 100万人ラインに赤線を引く
⑵ 帯グラフ
scales()関数をインストール、読み込む必要があります。セットアップチャンクに追加しておきましょう(最終成果物のquartoファイルも同様)
df_東京都知事選挙_候補者別得票数_long |>
filter(年 == 2024) |> # 2024年の選挙結果に限定
group_by(候補者名) |> # 開票区別のデータから候補者別の集計に加工する
summarise(投票者数 = sum(投票者数, na.rm = TRUE)) |>
mutate(
`得票数(千人)` = 投票者数/1000 # 桁数が多すぎるため
) |>
arrange(desc(`得票数(千人)`)) |>
slice_head(n = 5) |> # 上位5名に絞り込む
mutate(候補者名 = factor(候補者名, levels = unique(候補者名))) |>
mutate(
得票率 = scales::percent(`得票数(千人)`/sum(`得票数(千人)`), accuracy = 0.1)) |> # 比率(得票率)を算出
mutate(得票率 = as.numeric(gsub("%", "", 得票率))) |>
ggplot(aes(x = 得票率, y = "", fill = 候補者名)
) +
geom_bar(stat = "identity",
position = "fill") +
geom_text(aes(label = paste0(得票率, "%")),
position = position_fill(vjust = 0.5, reverse = FALSE),
color = "white") + # 得票率を図に貼り付ける
scale_x_continuous(
labels = scales::percent_format()
) + # 比率表示に適したX軸に変換
labs(
y = "",
x = "得票率"
) +
scale_fill_paletteer_d("PrettyCols::Fun") +
theme_minimal(
base_family = "HiraginoSans-W3"
)
Ⅴ. チャンクオプション
- チャンクを実行しない
- 一部のチャンクだけ動かないなどの理由で、レンダリングやすべてのチャンクの実行から除外したい場合に有効
- 図にタイトルを付ける
- 図の比率を変える
- コードを折り畳む
Code
df_東京都知事選挙_候補者別得票数_long |>
filter(年 == 2024) |> # 2024年の選挙結果に限定
group_by(候補者名) |> # 開票区別のデータから候補者別の集計に加工する
summarise(投票者数 = sum(投票者数, na.rm = TRUE)) |>
mutate(
`得票数(千人)` = 投票者数/1000 # 桁数が多すぎるため
) |>
arrange(desc(`得票数(千人)`)) |>
slice_head(n = 5) |> # 上位5名に絞り込む
mutate(候補者名 = factor(候補者名, levels = unique(候補者名))) |>
mutate(
得票率 = scales::percent(`得票数(千人)`/sum(`得票数(千人)`), accuracy = 0.1)) |>
mutate(得票率 = as.numeric(gsub("%", "", 得票率))) |>
ggplot(aes(x = 得票率, y = "", fill = 候補者名)
) +
geom_bar(stat = "identity",
position = "fill") +
geom_text(aes(label = paste0(得票率, "%")),
position = position_fill(vjust = 0.5, reverse = FALSE),
color = "white") +
scale_x_continuous(
labels = scales::percent_format()
) +
labs(
y = "",
x = "得票率"
) +
scale_fill_paletteer_d("PrettyCols::Fun") +
theme_minimal(
base_family = "HiraginoSans-W3"
)
Ⅶ. 宿題
1. 授業の感想
- 回答先:Google Forms
- 締め切り:2025年5月23日(金)23時59分まで
2. 演習
- 自分のデータで作った図(最低3つ)を見直し、ラベル、目盛りや色を変えて下さい
- 回答先:Google Forms
- 締め切り:2025年5月27日(火)23時59分まで
-
形式:(以下のいずれか)
- (推奨)quartroファイル+データ
- データについては、一度でも提出してあれば、再提出不要です
- R Studioで出力されたhtmlファイル
- (推奨)quartroファイル+データ