対応のあるデータを線でつないで増減をみるグラフを作りたくなったのでメモ。
サンプルデータ
library(tidyverse) ads <- data.frame(id=(1:5) ,x=c(9,6,3,8,7) ,y=c(5,1,2,4,1) ,z=c(8,7,9,5,2)) ads2 <- data.frame() for (i in (2:4)) { ads2 <- union_all(ads2 ,data.frame(id=ads[1] ,param=rep(colnames(ads[i]),nrow(ads)) ,aval =c(ads[,i]))) } ads2$param <- factor(ads2$param, level=c("x","y","z")) ads2$id <- factor(ads2$id)
作図
ggplot(data=ads2, mapping=aes(x=param, y=aval, group=id, color=id)) + geom_vline(xintercept="x", lty=1) + geom_vline(xintercept="y", lty=1) + geom_vline(xintercept="z", lty=1) + geom_line(size=1.2) + annotate("text", x="x", y=ads2[ads2$param=="x","aval"] ,label=ads2[ads2$param=="x","id"], hjust=2, size=8) + labs(title="対応のあるデータの変化の推移", x="時期", y="値") + scale_x_discrete(labels=c("時期1","時期2","時期3")) + theme(plot.title = element_text(size=20) ,axis.title = element_text(size=20) ,axis.text = element_text(size=20) ,legend.title = element_text(size=20) ,legend.text = element_text(size=20) )
2つの座標点の角度を求める
角度により増減の度合いを判断したいとする。
すると、コサインを知りたい。
弧度法による計算は次のとおり。atan2(アークタンジェント2)関数を用いる。度数法への変換もできる。
atan2 - Wikipedia
弧度法 : ラジアン = atan2(y, x)
度数法 : 度 = ラジアン × 180 ÷ 円周率
> #-- ここでは、y=関心のある値の差、x=1として、yの違いを角度で表す。 > ads$ラジアンxy <- atan2(y = ads$y - ads$x, x = 1) > ads$度xy <- ads$ラジアンxy * 180 / pi > > ads$ラジアンyz <- atan2(y = ads$z - ads$y, x = 1) > ads$度yz <- ads$ラジアンyz * 180 / pi > ads id x y z ラジアンxy 度xy ラジアンyz 度yz 1 1 9 5 8 -1.3258177 -75.96376 1.2490458 71.56505 2 2 6 1 7 -1.3734008 -78.69007 1.4056476 80.53768 3 3 3 2 9 -0.7853982 -45.00000 1.4288993 81.86990 4 4 8 4 5 -1.3258177 -75.96376 0.7853982 45.00000 5 5 7 1 2 -1.4056476 -80.53768 0.7853982 45.00000