霞と側杖を食らう

ほしいものです。なにかいただけるとしあわせです。[https://www.amazon.jp/hz/wishlist/ls/2EIEFTV4IKSIJ?ref_=wl_share]

Banking to 45°の学習記録

 

【学習動機】

ggplot2の学習を進めていて, グラフの作り方は多少分かったが, グラフをどう作るべきかは分からなかったため, それが分かるかもしれないと思い, “The Elements of Graphing Data”を読むことにした (和訳が出ているのだが, 入手困難.).

www.amazon.co.jp

これを読み進めていて, banking to 45°という概念に出会った. この概念について言及している日本語文献があまりなく(奥村先生のグラフの描き方に関するページ

https://oku.edu.mie-u.ac.jp/~okumura/stat/090503b.html

くらいしか見つからなかった.), これについて, ggplot2を利用しつつ, 記録しておこうと思った.

【学習記録】

アスペクト比はグラフから変化率を見極めるのに重要で, 最適なアスペクト比を求めるのに, banking to 45°という方法がある.

今回使用するライブラリは以下のもの.

library(ggplot2)
library(ggfortify)
library(ggthemes)
library(tidyverse)

アスペクト比

アスペクト比は, 縦の長さ/横の長さ. 我々は曲線の局所的な線の方向から, 風速とオゾンの変化率に関する情報をデコードしている. グラフのアスペクト比が異なると, この方向が変わってしまい, 読み取れる情報が変わりうる.

太陽の黒点データ

太陽の黒点データを見てみる.

head(sunspot.year)
## [1]  5 11 16 23 36 58
autoplot(sunspot.year) + theme(aspect.ratio=1)

autoplot(sunspot.year) + theme(aspect.ratio=0.055)

両方とも約11年周期のサイクルがあることには気付けるが, 上のグラフでは黒点の増加の方が減少よりも急速であることに気付きにくい. さらに注意深くみると, ピークが高いサイクルではその傾向が顕著である一方, ピークが低いサイクルではその傾向が見えないということまで気付くことができる.

Banking to 45°

局所的な線の方向, 傾きの絶対値を45°に中心化させると, 線の方向を読み取るのに最適になるようだ. その中心化がbanking to 45°と呼ばれている. (和訳は分からないし, 思い付かない. 関係ないが, ななめ45°という芸人のトリオがいたことをこれで思い出した.)

具体的な計算式についてはここでは省略する.

ggthemesパッケージに最適なアスペクト比を計算してくれる関数がある.

ggthemesのドキュメントから引用(https://cran.r-project.org/web/packages/ggthemes/ggthemes.pdf)

Calculate the optimal aspect ratio of a line graph by banking the slopes to 45 degrees as suggested by W.S. Cleveland. This maximizes the ability to visually differentiate differences in slope. This function will calculate the optimal aspect ratio for a line plot using any of the methods described in Herr and Argwala (2006). In their review of the methods they suggest using median absolute slope banking (’ms’), which produces aspect ratios which are generally the median of the various methods provided here.

このドキュメントの, Exampleで, coord_fixed(ratio = ratio)で比率を変えているが, bank_slopesの産出はアスペクト比を出していると思われるので, theme(aspect.ratio=ratio)とすべきなのではないかと思った. 以下ではそのようにしている.

x <- seq_along(sunspot.year)
y <- as.numeric(sunspot.year)
ratio <- bank_slopes(x, y)
m <- ggplot(data.frame(x = x, y = y), aes(x = x, y = y)) +
  geom_line() + theme_bw()
m

m + theme(aspect.ratio = ratio)

co2のトレンドデータ

co2のデータのトレンド部分について. co2をdecomposeで分解する.

co2d <- decompose(co2)
plot(co2d)

x <- seq_along(co2d$trend)
y <- as.numeric(co2d$trend)
df <-data.frame(x = x, y = y) %>% na.omit()
ratio <- bank_slopes(df$x, df$y)
m <- ggplot(df, aes(x = x, y = y)) +
  geom_line() + theme_bw()
m + theme(aspect.ratio = ratio)

m + theme(aspect.ratio = 0.055)

上のbanking to 45°によるアスペクト比のグラフからは, 曲線の凸性が見て取れるが, 下のグラフからそれを読み取るのは難しい.

EDAをしていく上で可視化は欠かせない作業だが, アスペクト比に気を付けながらグラフを作成していくことが重要のようだ.

【学習予定】

グラフのデザインについてもう少し学んでいきたいところ.