niszetの日記

10年目エンジニアが最近勉強したことを忘れないようにメモをする

coord_polarを使ってみる(追記)(修正)

自作geomのその前に

complex型を使う際には何かとcoord_polarの出番が多そう。ということで、ちょっと試してみました。
今回はこちらを参考にしています。

ggplot2 Quick Reference: coord | Software and Programmer Efficiency Research Group

パイチャートというのでしょうか、あの帯状の図は目にするのですが、coord_polarを使用してgeom_lineやgeom_pointを使用している例はあまり見てない気がします。
あたしこのパイ(チャート)嫌いなのよね…

さて、下記コードの前半は上記のサイトからのコピペですが、最後のプロット時にxlim,ylimを与えて、原点が含まれるようにしています。

library(ggplot2)

d=data.frame(height=c(1,2,2,3,4), weight=c(1,3,4,4,2))

p = ggplot() +
    geom_line(data=d, mapping=aes(x=height, y=weight)) +
    geom_point(data=d, mapping=aes(x=height, y=weight), size=8, fill="white", shape=21) +
    geom_text(data=d,mapping=aes(x=height, y=weight, label=seq(1,nrow(d))))

p+coord_equal() +xlim(0,5)+ylim(0,5)

結果はこう。
f:id:niszet:20170712234040p:plain

xlimで(ylim)はなくて、下のようにscale_x**、scale_y**でも良いです。上記のオブジェクトpをstr()など使って見てみるとわかりますが、デフォルトだとlimitsが入ってないのですね。
原点を含みたいのであれば必ずそれが入るようにxlim,ylimを指定してあげればよいということになりますね(max, min の中に0が入っているか?のチェックが必要かな)

さて、coord_polarを使ってみます。

dd <- d %>%  mutate(r=sqrt((height^2.0)+(weight^2.0)),theta=atan(height/weight))

p2 = ggplot() +
    geom_line(data=dd, mapping=aes(x=theta, y=r)) +
    geom_point(data=dd, mapping=aes(x=theta, y=r), size=8, fill="white", shape=21) +
    geom_text(data=dd,mapping=aes(x=theta, y=r, label=seq(1,nrow(dd))))

p2 + coord_polar(theta="x",start = -pi/2, direction = -1) +ylim(0,6)+scale_x_continuous(limits=c(0,2*pi),breaks=seq(0,2*pi,by=pi/2))

f:id:niszet:20170712234747p:plain

geom_lineがなんか変ですが、点については多分意図したものが出来たはず…。最初の図と点の位置はあっている(と思う)ので。
geom_lineはthetaの小さい順につないでいるように見えますね。これは要改良…。

とりあえず思いついたまま書いたのであまり良くないコードになってる気がします。後日清書しよ…

次はこれをcomplex型に使ってみます。今日は時間切れ。日付変わっちゃったけど。

追記(修正)

寝てる間にgeom_lineじゃなくてgeom_pathなら良いのでは?と気づきました。

p2 = ggplot() +
    geom_path(data=dd, mapping=aes(x=theta, y=r)) +
    geom_point(data=dd, mapping=aes(x=theta, y=r), size=8, fill="white", shape=21) +
    geom_text(data=dd,mapping=aes(x=theta, y=r, label=seq(1,nrow(dd))))

p2 + coord_polar(theta="x",start = -pi/2, direction = -1) +ylim(0,6)+scale_x_continuous(limits=c(0,2*pi),breaks=seq(0,2*pi,by=pi/2))

結果はこうです。意図通りっぽい

f:id:niszet:20170713075912p:plain

以下、マニュアルより
geom_path() connects the observations in the order in which they appear in the data.
geom_line() connects them in order of the variable on the x axis.

こちらで全文が見れます。 Connect observations — geom_path • ggplot2

やはり知っているつもりでも、細かいところはこまめにヘルプを見なくてはいけませんね。