6日間の血圧データをグラフにする
患者Aさんの収縮期血圧を、月曜日から土曜日までの6日間、歩行練習の前後に測定したとします。ここでは架空のデータを使い、グラフの描き方と読み取り方を練習します。血圧の単位はmmHgです。
月曜日, AM, 屋外歩行の前後で測定
火曜日, PM, 屋内歩行の前後で測定
水曜日, AM, 屋内歩行の前後で測定
木曜日, AM, 屋内歩行の前後で測定
金曜日, PM, 屋外歩行の前後で測定
土曜日, PM, 屋内歩行の前後で測定
グラフにすると、数値の一覧だけでは気付きにくい変化や違いを確認できます。この例は同じ患者さんの6日分の記録です。ただし、グラフから見える違いだけで、歩行練習や場所の効果を判断することはできません。
・練習前と練習後で、血圧はどのように変化しているでしょうか。
・日ごとの血圧には、どの程度の違いがあるでしょうか。
・時間帯や場所と合わせて見ると、どのような特徴に気付くでしょうか。
まずデータを入力し、簡単な散布図を描きます。その後、棒グラフや折れ線グラフなどで表示方法の違いを確認しましょう。コードは上から順に実行してください。必要なパッケージの追加はありません。
データセットの作成
以下のコードをRに貼り付けて実行してください。preは練習前、postは練習後の血圧です。dayは曜日、timeは時間帯(AM:午前、PM:午後)、placeは場所を表します。各ベクトルの値は、月曜日から土曜日の順に対応しています。data.frame()で、1行が1日分の記録となる表を作ります。
pre <- c(112, 138, 124, 120, 136, 142)
post <- c(138, 139, 136, 130, 143, 140)
day <- c("月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日")
time <- c("AM", "PM", "AM", "AM", "PM", "PM")
place <- c("屋外", "室内", "室内", "室内", "屋外", "室内")
data <- data.frame(pre, post, day, time, place)
print(data)> print(data)
pre post day time place
1 112 138 月曜日 AM 屋外
2 138 139 火曜日 PM 室内
3 124 136 水曜日 AM 室内
4 120 130 木曜日 AM 室内
5 136 143 金曜日 PM 屋外
6 142 140 土曜日 PM 室内
散布図は、二つの数値の関係を点で表すグラフです。まずは次の1行を実行してください。横軸が練習前、縦軸が練習後の血圧となり、一つの点が1日分の記録を表します。
plot(data$pre, data$post)
plot()には、横軸にするデータ、縦軸にするデータの順に指定します。data$preは、表dataからpre列を取り出す書き方です。
グラフで練習前後を比べる
各曜日の前後比較
棒グラフでは、曜日ごとに練習前(pre)と練習後(post)の血圧を並べます。rbind()で二つのベクトルをまとめ、beside = TRUEで棒を横に並べます。colは色、mainはタイトル、xlabとylabは軸の名前です。legend()で色の説明(凡例)を追加します。par()は余白の設定です。まずはコード全体を実行して、図を確認してください。
# 描画領域を調整
par(mar = c(5, 4, 4, 6)) # 右側の余白を広げる (右側が8)
# preとpostを比較する棒グラフを作成
barplot(rbind(pre, post),
beside = TRUE,
names.arg = day,
col = c("lightblue", "pink"),
main = "preとpostの比較",
xlab = "曜日",
ylab = "値")
# 凡例を右外に配置
legend("topright",
legend = c("pre", "post"),
fill = c("lightblue", "pink"),
xpd = TRUE, # 描画領域外に凡例を描く
inset = c(-0.2, 0.2)) # insetで右外に移動
par(mar = c(5.1, 4.1, 4.1, 2.1))
経時変化
折れ線グラフでは、日ごとの推移を確認できます。1:6は1から6までの数値です。plot()で練習前の線を描き、lines()で練習後の線を重ねます。type = “o”は点と線を表示する指定です。axis()で横軸に曜日を表示し、ylimで縦軸の範囲を指定します。
# 折れ線グラフの作成
plot(
1:6, pre, type = "o", col = "blue", pch = 16,
ylim = c(min(pre, post) - 10, max(pre, post) + 10),
xaxt = "n", xlab = "曜日", ylab = "値",
main = "preとpostの比較 (折れ線グラフ)")
lines(1:6, post, type = "o", col = "red", pch = 16)
# x軸のラベルを追加
axis(1, at = 1:6, labels = day)
# 凡例を追加
legend(
"bottomright", legend = c("pre", "post"),
col = c("blue", "red"), pch = 16, lty = 1)
前後比較
箱ひげ図では、データの中心やばらつきを確認できます。箱の中央の線は中央値、箱の下端と上端は第1・第3四分位数に対応します。赤い点は、points()で追加した平均値です。この図だけでは、同じ日の練習前後の対応は分かりません。
par(mar = c(5, 4, 4, 2))
# preとpostを比較する箱ひげ図の作成
# 箱ひげ図の作成
boxplot(pre, post,
names = c("pre", "post"),
col = c("lightblue", "pink"),
main = "preとpostの比較 (箱ひげ図)",
ylab = "値")
# 平均値を計算
pre_mean <- mean(pre)
post_mean <- mean(post)
# 平均値を箱ひげ図に追加 (赤い点)
points(1, pre_mean, col = "red", pch = 19) # preの平均
points(2, post_mean, col = "red", pch = 19) # postの平均
par(mar = c(5.1, 4.1, 4.1, 2.1))
【発展】各曜日の前後比較
ここからは発展課題です。同じ日の練習前後を1本の線で結び、変化の方向を確認します。右上がりなら血圧が上がり、右下がりなら下がっています。forは同じ操作を繰り返す書き方で、pre[i]はpreのi番目の値を取り出します。まず図の読み取りを優先し、繰り返し処理の詳細は後から確認しても構いません。
#余白調整
par(mar = c(5, 4, 4, 8))
# グラフの描画領域を設定
plot(c(1, 2), range(c(pre, post)), type = "n",
xlab = "歩行練習前後", ylab = "値",
main = "各曜日のpreとpostの比較",
xaxt = "n")
# x軸のラベルを設定
axis(1, at = c(1, 2), labels = c("pre", "post"))
# パステルカラーの設定
colors <- c("#FFB3BA", "#FFDFBA", "#FFC3FF", "#BAFFC9", "#BAE1FF", "#DABFFF") # パステルカラー
# 各曜日のデータを描画
for (i in 1:length(day)) {
lines(c(1, 2), c(pre[i], post[i]), col = colors[i], lwd = 2) # preとpostを線で結ぶ
points(c(1, 2), c(pre[i], post[i]), col = colors[i], pch = 16) # 点を追加
}
# 凡例を追加
legend(
"topright",
legend = day, col = colors,
lty = 1, pch = 16,
lwd = 2,
xpd = TRUE, # 描画領域外に凡例を描く
inset = c(-0.2, 0.2)
)
par(mar = c(5.1, 4.1, 4.1, 2.1))
【発展】dayとplaceを考慮した比較
発展課題:場所を色、曜日を点の形で区別します。青は屋外、赤は室内です。ifelse()で条件に応じた色を選びます。表示された違いは、この患者さんの記録の特徴であり、場所による効果を示すものではありません。
#余白調整
par(mar = c(5, 4, 4, 9))
# グラフの描画領域を設定
plot(c(1, 2), range(c(pre, post)), type = "n",
xlab = "歩行練習前後", ylab = "値",
main = "屋内と屋外でのpreとpostの比較",
xaxt = "n")
# x軸のラベルを設定
axis(1, at = c(1, 2), labels = c("pre", "post"))
# 色分けの設定 (屋外と屋内)
colors <- c("blue", "red") # 屋外を青、室内を赤
color_map <- ifelse(place == "屋外", colors[1], colors[2]) # 各データの色を決定
# 各曜日に対応するポイントの形状を設定
shapes <- c(16, 15, 17, 18, 19, 4) # 丸、四角、三角などの形状
shape_map <- setNames(shapes, day) # 曜日と形状を対応付け
# 各曜日のデータを描画
for (i in 1:length(day)) {
col <- color_map[i] # 屋外か屋内で色を選択
pch <- shape_map[day[i]] # 曜日に対応する形状を取得
lines(c(1, 2), c(pre[i], post[i]), col = col, lwd = 2) # preとpostを線で結ぶ
points(c(1, 2), c(pre[i], post[i]), col = col, pch = pch) # 点を追加
}
# 凡例用ラベルを作成 (曜日と場所を組み合わせる)
legend_labels <- paste(day, "(", place, ")", sep = "")
# 凡例を追加
legend(
"topright",
legend = legend_labels, col = color_map,
lty = 1, pch = shapes,
lwd = 2,
xpd = TRUE, # 描画領域外に凡例を描く
inset = c(-0.35, 0.2)
)
par(mar = c(5.1, 4.1, 4.1, 2.1))
