
【3-3】ChatGPTにいい感じに指示するために知っておきたい、Rのggplot2でグラフを作るときの基本(土台・フォント・aes)
*無料で全文読めます。
このマガジンではRの基本的な使い方を紹介していますが、今回はggplot2という超有名パッケージを使いグラフを作ってみる記事になります。
またChatGPTにお願いするとだいたいいい感じのグラフを作ってくれますが、細かい設定をしたい場合にどんなプロンプトを書けばよいか?に悩むことがあります。後半では土台・フォント・見た目などの細かい設定を紹介しますので、この記事を参考にしていただけると嬉しいです。
最初はとりあえずコードをコピペや写経しながらこんなグラフが書けるのか!?を体験していただくことを目標にしています。次にグラフの基本になる土台・フォント・aes・基本的なグラフの紹介を行います。
パッケージとデータの準備
使うパッケージはggplot2ですが、tidyverseパッケージに含まれています。
#pacmanパッケージがあるかを確認。なければinstall.packagesパッケージをインストール
if (!require("pacman")) install.packages("pacman")
#今回使うパッケージ
pacman::p_load(tidyverse)
#データ取り込みます。今回はdataという変数にデータを入れます
url <- "https://github.com/mitti1210/myblog/blob/master/data01.csv?raw=true"
data <- read.csv(url)
head(data)
#データの確認
str(data)
> str(data)
'data.frame': 200 obs. of 9 variables:
$ 氏名: chr "大津" "佐久間" "佐々木" "大和" ...
$ 性別: chr "男性" "女性" "男性" "男性" ...
$ 年齢: int 71 70 75 71 85 81 67 46 68 79 ...
$ 身長: int 152 162 156 161 141 190 152 166 155 146 ...
$ 体重: int 40 48 62 63 62 63 55 65 56 49 ...
$ SIAS: int 44 41 47 50 42 47 39 41 49 44 ...
$ BBS : int 42 42 44 41 55 45 43 44 35 46 ...
$ MMSE: int 30 17 21 23 24 18 23 25 22 14 ...
$ 歩行: int 0 1 1 0 1 1 0 1 0 1 ...
氏名:文字列(character)
性別:文字列(character)→因子型(factor)にする予定
年齢:整数(integer)
身長:整数(integer)
体重:整数(integer)
SIAS:整数(integer) *脳卒中方麻痺患者の総合評価。0-100のスケール。
BBS:整数(integer) *バランステストのスコア。0-56のスケール。
MMSE:整数(integer) *認知機能評価。0-30のスケール。
歩行:整数(integer) *0:歩行不能、1:歩行可能
*全て架空データです
とりあえずグラフを作ってみる
土台を作る
まずggplot2の基本はグラフを重ねるでした。

なのでまずは土台を作ります。
ggplot()

これで土台ができました。
グラフを重ねる
土台を作成したら、その上に+で繋げてレイヤーを重ねていきます。
%>%ではなく+で繋げるので注意してください。下につなげるほどレイヤーは上に重なります。
ggplot() + ←土台を作る
geom_point() ←散布図を上に重ねる
そしてdata = ◯◯がどのdata.frameを使うか?aes()の中にx軸をどの列にするのか?とy軸をどの列にするのか?の情報を入れます。
# 散布図を作成する
ggplot() +
geom_point(
data = data,
aes(x = 体重, y = 身長)
)
# こう書いても問題ない
ggplot() +
geom_point(data = data, aes(x = 体重, y = 身長))
# macだと文字化け(お豆腐)が出るのでフォントを指定する
# 今回はヒラギノ角ゴシック(HiraginoSans-W3)を選択
ggplot() +
theme_grey(base_family = "HiraginoSans-W3") +
geom_point(data = data, aes(x = 体重, y = 身長))
これを実行するとplotsビューに散布図が表示されます。
aes()のx = 体重, y = 身長の部分を自由に変えてみてください。
氏名は200人(水準)ありグラフには適しませんが、性別のようなカテゴリー変数は縦軸にも横軸にも使えます。
# 横軸を性別, 縦軸を年齢とする
ggplot() +
geom_point(data = data, aes(x = 性別, y = 年齢))
縦軸や横軸が文字列でもグラフが作成できることがggplot2の強みでです。
要素を追加してみる
次に性別で色分けしてみます。
aes()の中にcolor = 性別を追加します。
ggplot() +
geom_point(data = data, aes(x = 体重, y = 身長, color = 性別))
このようにaes()の中に色々な指定を行うことでグラフの見た目を変えることができます。
グラフを追加する
ggplot2はグラフを重ねることができます。
ここでは性別で色分けしたグラフに回帰直線を追加してみます。
回帰直線はgeom_smooth()で追加します。
method = "lm"とすることで回帰直線を追加します(直線以外の設定も可能)。
ggplot() +
geom_point(data = data, aes(x = 体重, y = 身長, color = 性別)) +
geom_smooth(data = data, aes(x = 体重, y = 身長, color = 性別), method = "lm")
# geom_point()とgeom_smooth()を入れ替えると、レイヤーの順番が変わります。
ggplot() +
geom_smooth(data = data, aes(x = 体重, y = 身長, color = 性別), method = "lm") +
geom_point(data = data, aes(x = 体重, y = 身長, color = 性別))
共通するものはまとめられる
dataやaes()の中に共通するものはまとめられます。
ggplot(data = data, aes(x = 体重, y = 身長, color = 性別)) +
geom_point() +
geom_smooth(method = "lm")
# こう書いても同じ
ggplot(data) +
aes(x = 体重, y = 身長, color = 性別) +
geom_point() +
geom_smooth(method = "lm")
このようにggplot()の中にdataやaes()を入れることでコードを短くすることができます。
グラフを上書きしていくイメージなので、同じ設定が複数はいると後にコードで記載したほうが優先されますので注意が必要です。
これでとりあえずグラフを作ってみましたが、ここからは具体的な解説を加えながらグラフを作っていきます。
設定あれこれ
土台の背景を変更する
theme_grey()はグレーの背景ですが、他にも色々指定できます。
theme_bw() : 白黒の背景
theme_linedraw() : 線画風の背景
theme_light() : 明るい背景
theme_dark() : 暗い背景
theme_minimal() : 最小限の背景
theme_classic() : 古典的な背景
theme_void() : 背景なし

theme_◯◯は大まかな設定ができますが、細かい設定は後述するtheme()を使います
土台のフォントを変更する
macで日本語を出力するときに文字化対策でフォントを指定しましたが、他にもいろいろなフォントがあります。
下記は一部ですがそれぞれ環境が違うのであったりなかったりするかもしれません。これもtheme_◯◯内で指定します。
windowsの場合
• "MS Gothic"(MS ゴシック)
• "MS Mincho"(MS 明朝)
• "MS PGothic"(MS Pゴシック)
• "MS PMincho"(MS P明朝)
• "Meiryo"(メイリオ)
• "Yu Gothic"(游ゴシック)
• "Yu Mincho"(游明朝)
macの場合
• HiraginoSans-W3(ヒラギノ角ゴシック)
• Osaka
• YuGo-Medium(游ゴシック) *Officeダウンロードしていたらあるかも
ウェブから好きなフォントをダウンロード
• BIZUDGothic-Regular * https://forest.watch.impress.co.jp/docs/news/1596755.html
# メイリオの場合
ggplot() +
theme_grey(base_family = "Meiryo") +
geom_point(data = data, aes(x = 体重, y = 身長))
aesについて
そしてggplot2の大きな特徴がaes()でグラフの構成を作ります。
ここでいう構成とはx軸はどの列を使うか?色は何の情報で塗り分けるのか?などです。
改めてコードを見ます
ggplot() +
geom_point(
data = data,
aes(x = 体重, y = 身長, color = 性別)
)
aes()を確認すると横軸は体重、縦軸は身長、色は性別の列で塗り分けています。ggplot2の良いところは性別が何カテゴリーでもその列にある水準の数だけ自動的に色を割り振ってくれます。今回は2色でしたが、もし"回答しない"等を入れていれば自動的に3色にしてくれます。
以下に代表的なものを紹介します。
x = x軸
y = y軸
color = 点や線の色
fill = 塗りつぶしの色
shape = 散布図などの点の種類
group = 折れ線グラフなどでどの点を繋げば良いのか?
linetype = 線の種類
label = グラフにテキストを描写する時
ymin, ymax = エラーバーの最小値と最大値
# グラフの色を変更するcolor
ggplot() +
geom_point(data = data, aes(x = 体重, y = 身長, color = 性別))
# 散布図のマーカーの形を変えるshape
ggplot() +
geom_point(data = data, aes(x = 体重, y = 身長, shape = 性別))
# 散布図の大きさを年齢の列を参考に変更するsize
ggplot() +
geom_point(data = data, aes(x = 体重, y = 身長, size = 年齢))
# 塗りつぶしの色を変えるfill
ggplot() +
aes(x = 体重, y = 身長) +
geom_smooth(data = data, aes(x = 体重, y = 身長, color = 性別, fill = 性別), method = "lm") +
geom_point(data = data, aes(x = 体重, y = 身長), color = "red)
#上記のようにaes()の中にcolor = 性別を入れると、性別で色分けされますが、aes()の外にcolor = "red"とすると、全て赤色になります。
aes()で設定する項目はグラフの種類によって必須のもの(x軸とy軸)と、任意で設定できるものがあります。具体的にはそれぞれのグラフの作製のときに紹介します。
文字列を軸にする際の並び順の指定
# 横軸を性別, 縦軸を年齢とする
ggplot() +
geom_point(data = data, aes(x = 性別, y = 年齢))
このグラフは女性→男性の順に並んでいますが、これはabc順の並びになっています。これを男性→女性にするにはfactor型にしてlevelsで設定すれば順番が変わります。factor型の記事に関してはこちらの記事で紹介しています。
# 横軸を性別, 縦軸を年齢とする
ggplot() +
geom_point(data = data, aes(x = 性別, y = 年齢))
# 性別をfactor型に変換しlevelsで男性→女性の順にする
data$性別 <- factor(data$性別, levels = c("男性", "女性"))
# もう一度グラフを出力してみる
ggplot() +
geom_point(data = data, aes(x = 性別, y = 年齢))
他にも棒グラフで値が大きい順に並べ替えるなども可能ですが、棒グラフを作る記事で紹介します。
グラフの縦横比を固定する
ggplot() +
geom_point(data = data, aes(x = SIAS, y = BBS)) +
coord_fixed()
RStudioのPlotsビューは、ウィンドウのサイズを変更すると縦横比が変わります。しかし方眼紙のように縦横比を固定したい場合もあります。その時はcoord_fixed()を追加すると縦横比が固定されます。
グラフの縦横を入れ替える
ggplot() +
geom_point(data = data, aes(x = 性別, y = SIAS)) +
coord_flip()
グラフを縦横入れ替えるときはaes(x = , y = )を入れ替えてもいいのですが、coord_flip()を使うと簡単に分けられます。これは横軸のラベルが長い場合に使うと便利さを感じられると思います。
タイトルや軸の名前を変える
# labs()のtitle, subtitle, captionを使ってみる, aesで使ったx, yも変更する
ggplot() +
geom_point(data = data, aes(x = 体重, y = 身長)) +
theme_gray() + # windwsの場合はこれでもok
#theme_gray(base_family = "HiraginoSans-W3") + # macの場合はフォントの指定が必要
labs(
title = "タイトル",
subtitle = "サブタイトル",
caption = "キャプション",
x = "x軸も変更可能",
y = ""
)
labs()を使うとタイトルやaesの列名を修正することができます。空欄にしたい場合は""でOKです。以下の設定が可能です
title : タイトル
subtitle : サブタイトル
caption : キャプション
グラフに使ったaesの列名
不要な凡例を消す
# 歩行をfactor型にする
data$歩行 <- factor(data$歩行, labels = c("歩行不可", "歩行可能"))
# fill = 歩行にしたことで凡例が出る
ggplot() +
geom_bar(data = data, aes(x = 歩行, y = BBS, fill = 歩行), stat = "summary", fun = "mean")
# 凡例を個別に非表示にする場合はguides()を使う
ggplot() +
geom_bar(data = data, aes(x = 歩行, y = BBS, fill = 歩行), stat = "summary", fun = "mean") +
guides(fill = "none)
# legend.position = "none"で複数の凡例をまとめて非表示にする
ggplot() +
geom_bar(data = data, aes(x = 歩行, y = BBS, fill = 歩行), stat = "summary", fun = "mean") +
theme(legend.position = "none")
例えば棒グラフで棒ごとに色を変えると凡例が不要な場合があります。
この場合はfill = 歩行と指定したことでできた凡例ですが、凡例が不要な場合は非表示にできます。
任意のaesの凡例を非表示にする場合はguides(不要なaes = "none")
全てのaesの凡例を非表示にする場合はtheme(legend.position = "none")
theme()で細かい設定を編集する
theme_grey()のようにまとめて見た目を変えるだけでなく、細かいところを1つずつ設定することが可能です。
# theme()で変更できる主な設定一覧
# theme(axix.title = ◯◯)のように使う
# 軸関連
# axis.title : 軸のタイトル
# axis.text : 軸の目盛りのテキスト
# axis.ticks : 軸の目盛り線
# axis.line : 軸の線
# パネル関連
# panel.background : パネルの背景
# panel.border : パネルの枠線
# panel.grid : グリッド線
# panel.grid.major : 主グリッド線
# panel.grid.minor : 副グリッド線
# 凡例関連
# legend.position : 凡例の位置 ("none", "left", "right", "bottom", "top")
# legend.title : 凡例のタイトル
# legend.text : 凡例のテキスト
# legend.background : 凡例の背景
# legend.key : 凡例のキー
# タイトル関連
# plot.title : グラフのタイトル
# plot.subtitle : サブタイトル
# plot.caption : キャプション
# plot.background : プロット全体の背景
# 例:タイトルを中央揃え、軸のテキストを青色に
ggplot() +
geom_point(data = data, aes(x = 体重, y = 身長)) +
theme(
plot.title = element_text(hjust = 0.5),
axis.text = element_text(color = "blue")
)
theme()の設定項目は上記ですが、 = ◯◯の箇所はelement_◯◯を使います。
# element_rect()の主なパラメータ
# fill : 塗りつぶし色
# colour : 枠線の色
# size : 枠線の太さ
# linetype : 枠線の種類
# element_line()の主なパラメータ
# colour : 線の色
# size : 線の太さ
# linetype : 線の種類
# lineend : 線の端点の形状
# arrow : 矢印の設定
# element_blank()
# 要素を非表示にする
# 例:element_text, element_line, element_rect, element_blankも使ってみる
# element_text()ではタイトルの色、フォントスタイル、位置を指定
# element_line()では軸線の色、太さ、線種を指定
# element_rect()ではパネルの背景色と枠線を指定
# element_blank()ではグリッド線を非表示に指定
ggplot() +
geom_point(data = data, aes(x = 体重, y = 身長)) +
theme(
plot.title = element_text(
colour = "red",
face = "italic",
hjust = 0.5
),
axis.line = element_line(colour = "blue", size = 1, linetype = "dashed"),
panel.background = element_rect(fill = "white", colour = "black"),
panel.grid = element_blank()
)
もしtheme_grey()など土台を設定する場合は先にtheme_grey(…) + theme(…)の順に設定します。逆にするとせっかく設定したtheme(…)をtheme_grey(…)で上書きされるので注意が必要です。
ただ初めてグラフを作る場合はここまで設定しなくてもいいかなと感じています。
グラフの種類
最初に散布図を作成しましたが、ggplot2では本当に多くのグラフを作ることができます。ここでは変数の数と組み合わせで軽く紹介していきます。今後の記事では1つ1つを詳しく説明していく予定です。

#上記グラフはこのデータを使いました
# シード値を設定して再現性を確保
set.seed(123)
# データフレームを作成
df <-
tibble(
A = rnorm(100, 30, 5),
B = rnorm(100, 40, 5),
C = rnorm(100, 50, 5)
) |>
pivot_longer(everything())
棒グラフ geom_point()
# 棒グラフはgeom_bar()で作成できる
ggplot(df) +
theme_light() +
#theme_light(base_family = "HiraginoSans-W3") + # macの場合はフォントの指定が必要
aes(x = name, y = value, fill = name) +
geom_bar(stat = "summary", fun = "mean") +
geom_errorbar(aes(ymin = mean(value) - sd(value), ymax = mean(value) + sd(value)), stat = "summary", width = .2) +
labs(x = "", y = "", title = "棒グラフ")
棒グラフはgeom_bar()で作成します。
geom_bar()を使うには大事な視点があります。
まだ集計されていないデータを使う場合 : stat = "summary"
今回のような生データはまだ"平均"のような値が存在していません。
そのため集計(summary)する必要があります。
どんな集計をするのがfun = "◯◯"になります。
平均 : fun = "mean"
中央値 : fun = "median"
最小値 : fun = "min"
最大値 : fun = "max"
普通はmenしか使うことはないと思いますが…既に集計されているデータを使う場合 : stat = "identity"
第2章で解説したgroup_by() → summarize()などを使い平均値を既に求めた場合や、そもそも集計を必要としないデータの場合はそのままの値"identity"を使うことになります。そのままの値なのでfun = "◯◯"は必要ありません。
棒グラフにはこういったグラフ以外にもいろいろな種類がありますが基本的にはgeom_bar()で作成可能です。
箱ひげ図 geom_boxplot
# 箱ひげ図はgeom_boxplot()で作成できる
ggplot(df) +
theme_light() +
#theme_light(base_family = "HiraginoSans-W3") + # macの場合はフォントの指定が必要
aes(x = name, y = value, fill = name) +
geom_boxplot() +
labs(x = "", y = "", title = "箱ひげ図")
箱ひげ図は1点の値しか提示しない棒グラフと違い、箱ひげ図では第1四分位数(Q1)、中央値(Q2)、第3四分位数(Q3)、外れ値を可視化します。ひげに関しては使用する人やソフトの設定によって違うことがあるので注意が必要です。
ヒストグラム・確率密度曲線 geom_histgram, geom_density
# ヒストグラムはgeom_histogram()で作成できる
ggplot(df) +
theme_light() +
#theme_light(base_family = "HiraginoSans-W3") + # macの場合はフォントの指定が必要
aes(x = value, fill = name) +
geom_histogram(alpha = 0.5, position = "nudge") +
labs(x = "", y = "", title = "ヒストグラム")
# 確率密度曲線はgeom_density()で作成できる
ggplot(df) +
theme_light() +
#theme_light(base_family = "HiraginoSans-W3") + # macの場合はフォントの指定が必要
aes(x = value, fill = name) +
geom_density(alpha = 0.5, position = "nudge") +
labs(x = "", y = "", title = "確率密度曲線")
ヒストグラムはデータの分布を確認するのにとても有効です。
Excelを使っているといきなり「平均と標準偏差で棒グラフを作る」みたいなことをしがちですが、まずはヒストグラムや次の確率密度曲線を使い、そもそも平均値がこのデータの代表値として有用か?を確認することが大事になります。
散布図, バブルチャート, ビースウォーム geom_point, geom_beeswarm

geom_point()による散布図は軸の指定が数字だけでなく文字列でも可能です。
加えてバブルプロットもgeom_point()で作成が可能です。しかし散布図は重なるとわからなくなるという課題もあります。特に一番右のような横軸がカテゴリーのときに重複が問題になることがあります。そのときにbeeswarmというグラフが選択肢に上がります。
# 散布図(beeswarm)はggbeeswarm::geom_beeswarm()で作成できる
# ggbeeswarmはggplot2の拡張パッケージなのでinstall.packages("ggbeeswarm")でインストールする必要がある
#install.packages("ggbeeswarm")
ggplot(df) +
theme_light() +
#theme_light(base_family = "HiraginoSans-W3") + # macの場合はフォントの指定が必要
aes(x = name, y = value, color = name) +
ggbeeswarm::geom_beeswarm() +
labs(x = "", y = "", title = "散布図(beeswarm)")
ちなみにbeeswarmはだいたいの分布がわかるので、ざっとデータを確認する時にも便利です。
ggplot(df) +
theme_light() +
#heme_light(base_family = "HiraginoSans-W3") + # macの場合はフォントの指定が必要
aes(x = name, y = value, fill = name) +
geom_bar(stat = "summary", fun = "mean") +
ggbeeswarm::geom_beeswarm() +
labs(x = "", y = "", title = "棒グラフとbeeswarmプロット")

エラーバー geom_errorbar
# 棒グラフにエラーバー(標準偏差)を重ねる
ggplot(df) +
theme_light() +
geom_bar(aes(x = name, y = value, fill = name),
stat = "summary", fun = "mean") +
geom_errorbar(aes(x = name, y = value),
stat = "summary", fun.data = "mean_sdl", fun.args = list(mult = 1), width = 0.2) +
labs(x = "", y = "", title = "棒グラフとエラーバー(標準偏差)")
# 棒グラフにエラーバー(標準誤差)を重ねる
ggplot(df) +
theme_light() +
geom_bar(aes(x = name, y = value, fill = name),
stat = "summary", fun = "mean") +
geom_errorbar(aes(x = name, y = value), stat = "summary", fun.data = "mean_se", width = 0.2) +
labs(x = "", y = "", title = "棒グラフとエラーバー(標準誤差)")
# 棒グラフにエラーバー(95%信頼区間)を重ねる
ggplot(df) +
theme_light() +
#theme_light(base_family = "HiraginoSans-W3") + # macの場合はフォントの指定が必要
geom_bar(aes(x = name, y = value, fill = name),
stat = "summary", fun = "mean") +
geom_errorbar(aes(x = name, y = value),
stat = "summary", fun.data = "mean_cl_normal", width = 0.2) +
labs(x = "", y = "", title = "棒グラフとエラーバー(95%信頼区間)") +
theme(legend.position = "none")

一つ前のbeeswarmはデータの確認には有効ですが、学会や論文ではエラーバーが必要です。ggerrorbar()は標準偏差や標準誤差を表示するのに便利です。ポイントとしてはgeon_bar()と同じで、生データには平均も標準偏差も標準誤差も計算されていなので、あらかじめ計算しておいたdata.frameを準備するか、stat = "summary" を使う必要があります。
ではどんな集計が必要になるかというと、以下の2つを計算する必要があります。事前に計算する場合はこの2列を意識して集計します。
ymin = 平均 - 標準偏差(標準誤差)
ymax = 平均 + 標準偏差(標準誤差)
これを実装する設定が以下です
標準偏差 : fun.data = "mean_sdl", fun.args = list(mult = 1)
mult = 1だと1標準偏差となり、mult = 2なら2標準偏差。デフォルトは2
標準誤差 : fun.data = "mean_se"
デフォルトでmult = 1なのでわざわざ指定する必要はない
95%信頼区間 : fun.data = "mean_cl_normal"
統計で標準的に使われる正規分布を仮定した平均±1.96*標準誤差
他にもブートストラップ法で推定できる"mean_cl_boot"もある
バイオリンプロット
ggplot(df2) +
theme_light() +
theme_light(base_family = "BizinGothicDiscord-Regular") +
aes(x = name, y = value, fill = name) +
geom_violin() +
labs(x = "", y = "", title = "バイオリンプロット")

あまりメジャーではありませんが、棒グラフや箱ひげ図より分布の形がわかりやすいグラフでgeom_violin()を使います。これは生データから作成できるのでstat = "summary"は必要ありません。
線グラフ geom_line, geom_path
df <-
tibble(
id = LETTERS[1:5],
day0 = c(15,12, 7, 11, 8),
day7 = c(17, 15, 9, 9, 13),
day14 = c(20, 17, 8, 13, 12)
) |>
pivot_longer(-id, names_to = "day", values_to = "test")
ggplot(df) +
theme_light() +
#theme_light(base_family = "HiraginoSans-W3") + # macの場合はフォントの指定が必要
aes(x = day, y = test, color = id) +
geom_point(aes(shape = id)) +
geom_line(aes(group = id, linetype = id)) +
labs(x = "", y = "", title = "折れ線グラフ")

折れ線グラフはgeom_lineやgeom_pathを用います。折れ線グラフは棒グラフと同じで生データをそのまま使うか、平均値など集計するかでデータの準備やstat = "summary"を使うかどうかが代わります。また線をつなぐためにどの点をつなぐか?を示すためにaes(group = ◯◯)を指定する必要があります。
ヒートマップ

ヒートマップはカテゴリ×カテゴリー×数値と3つのデータを集計する場合に有効です。ヒートマップを作る場合はgeom_tile()を用います。
まとめ
今回はグラフの土台になるところを解説しました。
次回は散布図だけでなくいろいろな種類のグラフを作成していきますが、今回の記事はどのグラフを作るにあたっても使う土台の情報になりますのでぜひブックマークしていただけますと幸いです。
(基本的にブログ・noteは自分が見直すよう、後輩に質問されたときにこれ見たら載ってるよと言うために作っています)
ここから先に記事はありません(投げ銭用として設定しています。書籍や勉強会代用にさせていただきます。)
ここから先は
¥ 300
この記事が気に入ったらチップで応援してみませんか?