実習レポートで人口を取り扱うために人口ピラミッドを作成しました。意外と人口ピラミッド作成ツールというのがないんですね。Excelで人口ピラミッドは作成できますが、かっこよくない。また、Rを使って人口ピラミッドを作成するというサイトは多くありますがいまいちよく分からない。それにサイトごとに人口ピラミッドの種類が異なり、自分が作成したいものがなかなか見つからず(特に白黒の人口ピラミッド)、結局AIに自分の希望を伝えてコードを書いてもらいRで作成しました。今後も人口ピラミッドを作成するため、ここで自分に合った人口ピラミッドを作成するコードを載せます。その上でそれぞれのコードが何を意味しているのかを勉強がてらに学んでいきます。
*ざっと書いたので、間違っている部分も十二分にあると思います。
AIが提案したコードが以下の通りです。
library(ggplot2)
library(dplyr)
library(tidyr)
library(scales)
male <- c(147,214,237,220,309,258,178,234,232,241,303,260,249,294,1003)
female <- c(145,169,155,191,193,200,180,237,232,256,326,278,306,332,1532)
age_group <- c("0-4","5-9","10-14","15-19","20-24","25-29","30-34",
"35-39","40-44","45-49","50-54","55-59","60-64","65-69","70+")
df <- data.frame(
Age = factor(age_group, levels = age_group),
Male = -male,
Female = female
)
df_long <- df %>%
pivot_longer(cols = c("Male","Female"),
names_to = "Sex", values_to = "Population")
ggplot(df_long, aes(x = Population, y = Age, fill = Sex)) +
geom_bar(stat = "identity", width = 0.9) +
geom_vline(xintercept = 0, color = "white", linewidth = 2) +
scale_x_continuous(
limits = c(-1750, 1750),
breaks = c(-1500, -1000, -500, 0, 500, 1000, 1500),
labels = function(x) comma(abs(x)),
expand = c(0,0)
) +
scale_fill_manual(values = c("Male" = "black", "Female" = "black")) +
labs(x = "人口(人)", y = "年齢") +
theme_minimal(base_size = 18) +
theme(
legend.position = "none",
axis.text.y = element_text(size = 16, face = "bold"),
axis.ticks.y = element_blank(),
axis.text.x = element_text(size = 14),
axis.title.x = element_text(size = 16, face = "bold"),
axis.title.y = element_text(size = 16, face = "bold"),
plot.margin = margin(10, 40, 10, 40)
)
これをRstudioにコピペすると上図の人口ピラミッドが作成されます。では裏ではどうやって作成されているのか一つ一つ見ていきましょう。
●コードの説明
①パッケージの読み込み
library(ggplot2)...グラフを書くためのメインパッケージ
library(dplyr)...データ加工
library(tidyr)...データを縦長に変換(pivot)
library(scales)...桁区切り
②ベクトルの定義と代入
male <-c(147,......,1003)
female <- c(145,......,1532)
...年齢階級順の人口数列をmaleとfemaleに代入
age_group <- c("0-4",......,"70+")
...縦軸に表示する年齢階級をage_groupに代入
③ggplotが読める形の表(データフレーム)の作成
df <- data.frame(
Age = factor(age_group, levels = age_group),
Male = -male,
Female = female
)
...表を作成。ここではage_groupをfactorに変換。これによって順序を指定の年齢順に固定する(45歳~49歳、5歳~9歳、50歳~54歳という順序になることを防ぐ)。Maleを「マイナスmale」とし、Femaleを「female」とすることで、男性が左、女性が右に伸びるグラフを作る。
df_long <- df %>%
pivot_longer(cols = c("Male","Female"),
names_to = "Sex", values_to = "Population")
...dfを実行してpivot_longer(Male列とFemale列を縦に並べる。元の列名であったMaleとFemaleがSex列に文字列として入る。元のMaleとFemale列の中身の数値が、Population列に入る。)を実行。Age,Sex,Populationの3つの列を作成し、直後のx軸、y軸、グループ分けに必要
④実際の描写コード
ggplot(df_long, aes(x = Population, y = Age, fill = Sex))
...df_longを使ってx軸をPopulation,y軸をAge,fill(塗り分け)をSexで塗り分けるに指定。
geom_bar(stat = "identity", width = 0.9)
...棒グラフを描くレイヤー。データの値をそのまま棒の長さに使う。棒の太さは0.9(1.0で隣の棒とくっつく)。
geom_vline(xintercept = 0, color = "white", linewidth = 2)
...x=0に白い縦線を引く。
scale_x_continuous(
limits = c(-1750, 1750),
breaks = c(-1500, -1000, -500, 0, 500, 1000, 1500),
labels = function(x) comma(abs(x)),
expand = c(0,0)
)
...横軸の見え方を指定。横幅の最大値を±1750に固定。表示する目盛ラベルを指定。目盛ラベルの4桁以上の数字(絶対値)に桁区切りを行う。グラフの左右に余白をつけない。
scale_fill_manual(values = c("Male" = "black", "Female" = "black"))
...性別ごとの色を指定。
labs(x = "人口(人)", y = "年齢")
...軸ラベルを設定
theme_minimal(base_size = 18)
...文字サイズを18に設定
theme(
legend.position = "none",
axis.text.y = element_text(size = 16, face = "bold"),
axis.ticks.y = element_blank(),
axis.text.x = element_text(size = 14),
axis.title.x = element_text(size = 16, face = "bold"),
axis.title.y = element_text(size = 16, face = "bold"),
plot.margin = margin(10, 40, 10, 40)
)
...凡例を消去。年齢階級の文字を大きく太字にする。y軸の目盛り線を消す。x軸の数字の文字サイズを14にする。x軸、y軸のタイトルの文字サイズと太さ。左右に40の余白を入れる。
これで以上となります。言われれば分かりますけど、何も見ずに自分で0から作成するのは慣れが必要ですね。仕組みが分かっただけでも一歩前進と考えてこれからはRについてもう少し深掘りしていきたいです。JavaScriptも前まで勉強していましたが、実用性の面では、現在の自分の状況ではRの方が高いので、しばらくRについて勉強していきます。
