雨温図を作成するときなど、棒グラフに折れ線グラフを重ねたいときの方法です。
データの作成
まずは適当なデータを作成します。 ここでは、気象庁から東京都の2023年の月ごとの降水量と気温のデータをいただきます。 データソースはここです。
d <- data.frame(month = 1:12, precipitation = c(15.5, 40.5, 145.0, 90.0, 159.0, 347.0, 30.0, 132.5, 229.0, 147.0, 41.5, 19.5), temperature = c(5.7, 7.3, 12.9, 16.3, 19.0, 23.2, 28.7, 29.2, 26.7, 18.9, 14.4, 9.4))
d
month precipitation temperature
1 1 15.5 5.7
2 2 40.5 7.3
3 3 145.0 12.9
4 4 90.0 16.3
5 5 159.0 19.0
6 6 347.0 23.2
7 7 30.0 28.7
8 8 132.5 29.2
9 9 229.0 26.7
10 10 147.0 18.9
11 11 41.5 14.4
12 12 19.5 9.4
最低限の可視化
それぞれのデータを最低限のコードで可視化してみます。
平均気温
月ごとの平均気温を折れ線グラフで表示します。
plot(d$month, d$temperature, type = "o")
とりあえずグラフを重ねる
グラフを重ねるには、いくつかの方法があります。 代表的な方法は、plot
関数やbarplot
関数などを用いてプロットを作成した後、lines
やpoints
などの関数で重ね描きをする方法です。
新しいグラフ領域、つまりプロットを作成するときに最初に使用する関数を高水準描画関数といいます。 例えば、plot
やbarplot
、boxplot
などの関数が挙げられます。 この関数はグラフ領域、軸、軸ラベルなどを一気に作成し、それだけで一つのグラフを完結できるようなものになります。
その上から重ね描きができる関数を低水準描画関数といいます。 例えば、lines
やpoints
,abline
などの関数が挙げられます。 これらの関数は軸ラベルや軸目盛り、枠などは描画せず、特定のデータを可視化するために用いられます。
しかし、plot
をした時点でx軸とy軸の目盛りの値が決まり、lines
などで作成するグラフもそれに従うため、今回のようにデータの値の桁が異なる場合にはうまく描画できません。
試しに降水量の棒グラフに気温の折れ線グラフを重ねてみます。
barplot(d$precipitation)
lines(d$month, d$temperature, type = "o")
降水量が最大300mm程度に対し、気温はせいぜい30~40℃程度のため、気温の月変化がよく見えません。 しかも、x軸がズレており、折れ線グラフがきれいに重なっていません。
par(new = TRUE)
によるグラフの重ね描き
そこで、barplot
とplot
を直接重ねてみます。 本来であればこれらを合わせて使うと重ならずに新しいグラフ領域が描画されますが、par(new = TRUE)
を入れることで、重ねることができます。
barplot(d$precipitation)
par(new = TRUE)
plot(d$month, d$temperature, type = "o")
グラフがそれぞれ別の目盛りで描画されていることがわかります。 あとはうまく調整していけば良さそうです。
棒グラフの中心に折れ線グラフをあわせる
折れ線グラフの各月の点が棒グラフとズレてしまっています。 うまく合わせるには、棒グラフの各棒の中心のx座標を取得し、折れ線グラフのx軸データに適用します。 棒グラフ自体を変数にいれると、各棒の中心のx座標を得ることができます。 また、2つのグラフのx座標の最大、最小値をxlim
で合わせます。
bar_centers <- barplot(d$precipitation)
[,1]
[1,] 0.7
[2,] 1.9
[3,] 3.1
[4,] 4.3
[5,] 5.5
[6,] 6.7
[7,] 7.9
[8,] 9.1
[9,] 10.3
[10,] 11.5
[11,] 12.7
[12,] 13.9
barplot(d$precipitation, xlim = c(0, 14))
par(new = TRUE)
plot(bar_centers, d$temperature, type = "o", xlim = c(0, 14))
うまく折れ線グラフの点が棒グラフのそれぞれの棒の中心に来ています。
Back to top